cdkを使ってFargateにデプロイをしようとしたが、一向にリソースが作成されず以下のようなエラーが出てタイムアウトになってしまった。原因の調査に時間がかかったのでその記録
CannotPullContainerError: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
結論
パブリックなコンテナレジストリからイメージを取得する時は、assignPublicIp
をtrueにしましょうという話
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-pull-container-error/
プログレスバーが動かない…
自分の持っているcdkのコードを久しぶりに使って、ECSにデプロイしようとしたが久しくcdkを触ってなかったので、何か問題が発生したときにイメージの不備かCDkの不備かの判断がつくようにいったんdockerイメージをnginx:latest
に指定してデプロイしようとしてみた。
が、途中からいくらたってもプログレスバーが変化しなくなった。。。
hogehoge-production
hogehoge-production: deploying...
hogehoge-production: creating CloudFormation changeset...
[███████████████████████████████████████▍··················] (17/25)
Fargateのタスクが何回も落ちているみたい。調べると https://registry-1.docker.io/v2/
からイメージが取得できないらしい
CannotPullContainerError: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
ぐぐると、
パブリックサブネットでタスクを起動する場合は、Amazon EC2 コンソールでタスクを起動するときに、[自動割り当てパブリック IP] を [有効] にします。これにより、イメージを取得するためのアウトバウンドネットワークアクセスをタスクに付与できます。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-pull-container-error/
とのこと。自動割り当てパブリックIPをtrueにしたくなかったので、ECRにnginxイメージを移動させて、FargateのdockerイメージはECRから取得するように試すと問題なく動いた
+ const repository = ecr.Repository.fromRepositoryName(
+ this,
+ `ecr-${id}`,
+ 'nginx'
+ )
// Create a load-balanced Fargate service and make it public
const service = new ecs_patterns.ApplicationLoadBalancedFargateService(this, `ecs-service-${id}`, {
cluster: cluster, // Required
cpu: 512,
desiredCount: 1, // Default is 1
taskImageOptions: {
- image: ecs.ContainerImage.fromRegistry("nginx:latest"),
+ image: ecs.ContainerImage.fromEcrRepository(repository, "latest"),
containerPort: 80,
enableLogging: true,
logDriver: logDriver,
environment: {
// 環境変数
},
},
memoryLimitMiB: 1024, // Default is 512
publicLoadBalancer: true,
assignPublicIp: false,
securityGroups: [appSecurityGroup]
})