この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは!コンサル部のinomaso(@inomasosan)です。
弊社の以下ブログを参考にECS Execの設定をしていたところ、ECSサービスのenableExecuteCommand
有効にする設定でエラーとなりハマってしまいました。
今回はエラー原因と解決方法をまとめていきます。
まずは結論
ECSタスクロールのSSMセッションマネージャー関連の権限不足が原因でした。
環境
今回実行した環境は以下の通りです。
- macOS Big Sur 11.6
- AWS CLI 2.2.35
- Fargateプラットフォーム 1.4.0
エラー事象
ECSサービスのenableExecuteCommand
有効にするため、以下のコマンドを実行しました。
$ aws ecs update-service \
--cluster [クラスター名] \
--service [サービスー名] \
--enable-execute-command
すると、以下のようなエラーメッセージが返ってきました。
An error occurred (InvalidParameterException) when calling the UpdateService operation: The service couldn't be updated because a valid taskRoleArn is not being used. Specify a valid task role in your task definition and try again.
原因
以下のSSMセッションマネージャ用IAMポリシーを作成したのですが、アタッチ先をECSタスク実行ロールにしたのが原因です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
最初の結論で記載した通り、上記IAMポリシーはECSタスクロールにアタッチしなくてはなりません。
ロールの違いについて
ECSのタスク実行ロールとタスクロールは別物です。
タスク実行ロールはECSコンテナエージェントがECRからのコンテナイメージプルや、コンテナログをCloudWatchに送信するためIAMポリシーが必要となります。
AWSマネージメントコンソールから作成した場合は、以下のデフォルトIAMポリシーが作成されます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
一方タスクロールはコンテナが他のAWSサービスと連携する際にのみ、必要なIAMポリシーを設定します。
詳細については、Toriさんの以下ツイートがわかりやすかったです。
ECS と IAM の話です
1. Task role
アプリに IAM 権限が必要なときに設定するもの (例: アプリから S3 触りたい、DDB 触りたい)
2. Task "execution" role
ECS Agent のようなコンテナ実行環境のエージェントが必要とする IAM 権限を設定するもの (例: ECR からイメージ pull、CWLogs にログ送る) pic.twitter.com/QZs8AG974i
— Tori Hara (@toricls) August 19, 2021
ところで何でこんなミスしたの
ECSのIAMロールの違いがよくわかっておらず、タスク実行ロールに必要なIAMポリシーがアタッチされてればイケるかなーと思ったら見事にハマりました…
横着は良く無いですね。
まとめ
Toriさんの解説ツイートは以前にも見たことがあったのですが、実際に利用する(ハマる)ことでちゃんと理解できました。
やはり実際に手を動かすことは大事です。
この記事が、どなたかのお役に立てば幸いです。それでは!