ECSでECRからdocker pullをする際に気を付けること
はじめに
SHIFTからシステム・アイに出向中の斎藤です。少し前にECSでECRからdocker pullをしようとした際にエラーが出てかなり解決に時間がかかってしまいましたので、その時の状況と解決方法を共有します。
エラー内容
ECSでECRからdocker pullをしようとすると、以下のようなエラー文が出ました。
直訳すると、「ResourceInitializationError:シークレットまたはレジストリ認証をプルできません:実行リソースの取得に失敗しました:ecrレジストリ認証を取得できません:サービス呼び出しが3回再試行されました:RequestError:リクエストの送信に失敗した原因:Post https://api.ecr.[region].amazonaws.com 」となります。
どうやら、ECSとECS間でのやりとりがうまくいっていないようでした。
エンドポイント
そこで調べると、↓の記事を見つけました。
【衝撃に備えろ】Fargate PV1.4のVPCエンドポイント変更点について | DevelopersIO
この記事によると、Fargate 起動タイプとプラットフォームバージョン 1.4.0 以降を使用する Amazon ECS タスクでは以下のVPCエンドポイントが必要になります。
com.amazonaws.[region].ecr.dkr
com.amazonaws.[region].ecr.api
S3 ゲートウェイエンドポイント
com.amazonaws.[region].logs
確認してみると、S3 ゲートウェイエンドポイント以外のエンドポイントは作成されていない状態になっていました。なので、これらのエンドポイントを作成し、再度docker pullを試してみましたが同じエラーが出てしまいました。
エラー文でググると、↓の記事を見つけました。
Amazon ECS で「unable to pull secrets or registry auth」(シークレットまたはレジストリー認...
この記事によると、エラーの解決方法は、次の4つとしていました。(今回の場合はSystems Manager(機密情報の参照)を使用していないので4つとしています。)
サブネットからインターネットへのルートを確認する
ネットワーク ACL とセキュリティグループの設定を確認する
Amazon VPC エンドポイントを確認する
IAM ロールとアクセス許可を確認する
(Amazon ECS タスク定義で参照されている機密情報を確認する)
これらのうち、エンドポイントは確認したので、残りをしらみつぶしに調べました。
IAMロール
解決方法をひとつひとつ確かめていくと、IAMロールを修正することでエラーを解決することができました。↓の記事には、「AmazonEC2ContainerRegistryReadOnly」というポリシーがないとECS操作時にECRからDockerイメージをPullできずにエラーが出てしまうと記載されています。
ECRとECSを使ってNginxのページを表示させよう(第2回)
このポリシーをECSタスク実行ロールにアタッチしたら、エラーが消え、無事にECRからdocker pullできました。以下ではポリシー内容を具体的に見ていきます。
AmazonECSTaskExecutionRolePolicy
ECSのタスク実行ロールである「ecsTaskExecutionRole」にもともとアタッチされているポリシーである「AmazonECSTaskExecutionRolePolicy」の説明にはCloudWatchのログへの書き込みとECRの読み込みができると記載されているので、docker pullもできるものだと勘違いをしていました。
Amazon ECS タスク実行IAM ロール - Amazon Elastic Container Service
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
AmazonEC2ContainerRegistryReadOnly
このポリシー「AmazonEC2ContainerRegistryReadOnly」をアタッチすると、ECRに対する読み取り、イメージリストのリストの作成、Docker CLI を使用して Amazon ECR からイメージをプル、つまり、docker pullが使用できるようになります。
Amazon Elastic Container Regist の AWS 管理ポリシー - Amazon ECR
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:GetLifecyclePolicy",
"ecr:GetLifecyclePolicyPreview",
"ecr:ListTagsForResource",
"ecr:DescribeImageScanFindings"
],
"Resource": "*"
}
]
}
おわりに
今回のエラーの原因は、ECRへのIAMポリシーが足りておらず、docker pullができないためでした。よく知らないサービスを触る際はIAMロール、ポリシー周りは特に注意して設定するべきだと学びました。また、問題に対する原因探索はやみくもに設定をいじるのではなく、一度手を止め、考えうる原因を洗い出し、計画的にひとつひとつ選択肢を減らしていくのが重要であると再認識しました。焦らずに観察→計画→実行の流れを意識したいです。
参考文献
【衝撃に備えろ】Fargate PV1.4のVPCエンドポイント変更点について | DevelopersIO
Amazon ECS で「unable to pull secrets or registry auth」(シークレットまたはレジストリー認...
Amazon ECR インターフェイス VPC エンドポイント (AWS PrivateLink) - Amazon ECR
ECRとECSを使ってNginxのページを表示させよう(第2回)
Amazon ECS タスク実行IAM ロール - Amazon Elastic Container Service
Amazon Elastic Container Regist の AWS 管理ポリシー - Amazon ECR
――――――――――――――――――――――――――――――――――
【ご案内】
ITシステム開発やITインフラ運用の効率化、高速化、品質向上、その他、情シス部門の働き方改革など、IT自動化導入がもたらすメリットは様々ございます。
IT業務の自動化にご興味・ご関心ございましたら、まずは一度、IT自動化の専門家リアルグローブ・オートメーティッド(RGA)にご相談ください!
お問合せは以下の窓口までお願いいたします。
【お問い合わせ窓口】
窓口:rga@systemi.co.jp
URL:https://rg-automated.jp