Terraformで構築したVPCエンドポイントのDNS名が無効で、ECSからECRへのイメージ取得でつまづいたこと
こんにちは、ゲームソリューション部のsoraです。
今回は、Terraformで構築したVPCエンドポイントのDNS名が無効で、ECSからECRへのイメージ取得でつまづいたことについて書いていきます。
結論
はじめに、結論としては以下です。
- Terraformでインターフェース型のVPCエンドポイントを構築するとき、デフォルトでDNS名が無効になっている。
- DNS名を有効にする場合は、明示的に設定する必要がある。
resource aws_vpc_endpoint ecr_dkr {
vpc_id = aws_vpc.this.id
subnet_ids = [aws_subnet.private_1a.id, aws_subnet.private_1c.id]
service_name = "com.amazonaws.ap-northeast-1.ecr.dkr"
vpc_endpoint_type = "Interface"
security_group_ids = [aws_security_group.vpce_ecr_dkr_sg.id]
# デフォルトでfalseなため、明示的にtrueにする
private_dns_enabled = true
}
本ブログでは、つまづいたときに確認したポイントを記載していきます。
つまづいた場面
プライベートサブネットにあるECS Fargateで、ECRからイメージ取得をしようとしたところ、timeoutエラーになりました。
当時確認したポイントは以下です。
- ECRのイメージ名も正しく指定できている。
- ECSのタスク実行ロールに、ECRやログ出力などの権限を付与している。
- Admin権限を付与しても上手くいかないことも確認
- 必要なエンドポイントも作成している(リージョンの部分はリージョンにより異なります。)
com.amazonaws.ap-northeast-1.ecr.api
com.amazonaws.ap-northeast-1.ecr.dkr
com.amazonaws.ap-northeast-1.logs.amazonaws.com
com.amazonaws.ap-northeast-1.s3.amazonaws.com (Gateway)
- VPCエンドポイントのセキュリティグループにて、ECSからのインバウンドを許可している。
- ルートテーブルの設定も、エンドポイントでない別の場所にルーティングするような設定も入れていない。
解決策
TerraformでVPCエンドポイントを構築するとき、デフォルトパラメータとしてDNS名が無効になっていることがわかったため、明示的に有効に変更しました。
resource aws_vpc_endpoint ecr_dkr {
vpc_id = aws_vpc.this.id
subnet_ids = [aws_subnet.private_1a.id, aws_subnet.private_1c.id]
service_name = "com.amazonaws.ap-northeast-1.ecr.dkr"
vpc_endpoint_type = "Interface"
security_group_ids = [aws_security_group.vpce_ecr_dkr_sg.id]
# デフォルトでfalseなため、明示的にtrueにする
private_dns_enabled = true
}
マネージメントコンソールで設定するときも同様の設定なのかなと気になって確認してみたところ、デフォルトでチェックされている状態でした。
余談ですが、VPCをTerraformで構築するときのデフォルトパラメータは、DNS解決は有効、DNSホスト名は無効です。
これはマネージメントコンソールでVPCを作成するときと同じです。
最後に
今回は、Terraformで構築したVPCエンドポイントのDNS名が無効で、ECSからECRへのイメージ取得でつまづいたことを記事にしました。
どなたかの参考になると幸いです。