2021.12.08
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
今回は 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/