公開日:2021.12.08

ECS Fargate で ECS exec を利用する

テクログaws

今回は ECS Fargate 上で Linux コマンドを実行できる ECS exec を紹介します。

「Fargate だと EC2 みたいにサーバー内部で好きな時にコマンドを実行できない!」という方にオススメの機能です。

詳細は参考元を見てください。

ECS exec のいいところ

  • SSM セッションマネージャーと同様の仕組み
    • SSH ポートを開ける必要はない
    • 踏み台不要
    • Fargate では毎回 ECSタスクのグローバル IP が変わるが、気にする必要がない
  • AWS CLI があれば使用可能
    • ただし、プラグインのインストールは必要

前提条件

  • Fargate Platform version は 1.4.0
  • AWS CLI のバージョンは v1 なら 1.19.28 以上、v2 なら 2.1.31 以上

ECS 側の設定

ECS exec を有効化する必要があります。

既存のECS サービスを更新する場合

profile=プロファイル名
clusterName=ECSクラスター名
serviceName=ECSサービス名


aws --profile $profile ecs update-service \
    --cluster $clusterName \
    --service $serviceName \
    --enable-execute-command

新規作成(Terraform)

aws_ecs_service リソースに enable_execute_command = true を追加して作成します。

# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service
resource "aws_ecs_service" "trial" {
  # 省略

  # ECS exec
  enable_execute_command = true

  # 省略
}

AWS CLI 側の設定

前提条件

  • AWS 公式が提供している AWS CLI Docker イメージを用いる
    • Windows 10(Cygwin 経由)で扱う
  • 今回は 2.3.7 を使用

以下、関連記事です。

Docker イメージの用意

公式が提供している AWS CLI のイメージをそのまま利用しても、SSM セッションマネージャーの実行ができません。

Dockerfile で セッションマネージャープラグインを入れたイメージを用意します。

FROM amazon/aws-cli:2.3.7

# ------------------------------
# AWS Session Manager plugin
# ------------------------------
RUN curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
RUN yum install -y session-manager-plugin.rpm

今回は aws-cli-ssm-plugin という名前で用意しました。

docker build  -t aws-cli-ssm-plugin .

alias の用意

まず ~/.bashrc に docker コマンドの alias を追加します。エイリアス名は awsSSM にします。

今回は Cygwin 上で動かしているので、一部特殊な操作が入っています。

以下、 ユーザー名 user の場合の追加例です。

# Cygwin 内で Windows 用のパス形式にカレントディレクトリのパスを変換
function pwdwin(){
  cygpath -pw $PWD | sed "s//\/g"
  # cygpath -pw $PWD
}

# AWS CLI with SSM plugin
alias awsSSM="docker run --rm -it -v 'C:\cygwin64\home\user\.aws':/root/.aws -v \"\`pwdwin\`\":/aws  --env AWS_PAGER=\"\"  aws-cli-ssm-plugin"

ECS exec 実行

以下、sh コマンドでインタラクティブにシェルを動かす例です

profile=プロファイル名
clusterName=ECSクラスター名
taskID=ECSタスクのID
containerName=コマンドを実行したいコンテナの名前

awsSSM --profile $profile ecs execute-command \
  --cluster  $clusterName
  --task  $taskID
  --container $containerName \
  --interactive \
  --command "sh"

成功すると、以下のようにシェルが動きます。

The Session Manager plugin was installed successfully. Use the AWS CLI to start
a session.


Starting session with SessionId: ecs-execute-command-0c1e3bc51c95d0ffd
/example # ls
README.md       composer.lock   public          tests
app             config          resources       vendor
artisan         database        routes          webpack.mix.js
bootstrap       package.json    server.php
composer.json   phpunit.xml     storage
/example #

注意点

  • 「cron のような定期実行に利用したい」場合は、定期実行用のECS タスクを別途立ち上げる方がいい

まとめ

  • ECS exec により、Fargate でも セッションマネージャーと同じ要領で Linux コマンドを実行可能
    • SSH ポートを開ける必要はない
    • 踏み台不要
    • Fargate では毎回 ECSタスクのグローバル IP が変わるが、気にする必要がない
  • AWS CLI があれば使用可能
    • ただし、プラグインのインストールは必要

デバッグなどで非常に有用なので、是非利用してみてください!

参考元

https://dev.classmethod.jp/articles/ecs-exec/

https://dev.classmethod.jp/articles/ecs-exec-enableexecutecommand-error/

この記事を書いた人

Hary

入社年2020年

出身地山口

業務内容インフラ

特技または趣味ゲーム

Haryの記事一覧へ

テクログに関する記事一覧