AWS Transit Gateway の検証をしていて、アウトバウンド用 VPC に設置した Amazon ECR の VPC エンドポイントを他の VPC から参照する必要がありました。
Amazon ECR の VPC エンドポイントはインターフェイス型であるため、 Integrating AWS Transit Gateway with AWS PrivateLink and Amazon Route 53 Resolver | Networking & Content Delivery を参考にすれば簡単にできると考えていましたが、一筋縄ではいきませんでした…。
Amazon ECR の VPC エンドポイントには ecr.api と ecr.dkr の2種類がありますが、前者は参考にした手順で設定することができましたが、 ecr.dkr
は追加の手順が必要でした。そのため、ここに手順を残しておきます。
手順
1. ecr.dkr の VPC エンドポイントの作成
ecr.dkr の VPC エンドポイントを作成します。作成するときはプライベート DNS 名を無効にする必要があります。既存のエンドポイントもプライベート DNS を無効化することができます。
2. プライベートホストゾーンの作成
ドメイン名を dkr.ecr.ap-northeast-1.amazonaws.com
でプライベートホストゾーンを作成します。
AWS CLI で作成する場合は、下記のような感じになります。
$ aws route53 create-hosted-zone \
--name dkr.ecr.ap-northeast-1.amazonaws.com \
--vpc VPCRegion=ap-northeast-1,VPCId=vpc-xxxx \
--caller-reference 20200417102500 \
--hosted-zone-config Comment='ECR DKR VPC Endpoint',PrivateZone=true \
3. レコードセットの作成
作成したプライベートホストゾーンに下記のレコードセットを作成します。
- 名前が
dkr.ecr.ap-northeast-1.amazonaws.com
のレコードセット- エイリアスレコードとして VPC エンドポイントを設定
- 名前が
*.dkr.ecr.ap-northeast-1.amazonaws.com
のレコードセット- CNAME として
dkr.ecr.ap-northeast-1.amazonaws.com
を設定
- CNAME として
1 のレコードセットのみを作成した場合に、 Amazon ECR から Docker イメージがプルができなくなります。Amazon ECR の URI は 1234567892012.dkr.ecr.ap-northeast-1.amazonaws.com のようになるため、この URI でも名前解決できるようにする必要があるため、 2 のレコードセットを作成する必要があります。
AWS CLI で作成する場合は、下記のような感じになります。
aws route53 change-resource-record-sets \
--hosted-zone-id /hostedzone/xxxx \
--change-batch '{
"Changes": [
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "dkr.ecr.ap-northeast-1.amazonaws.com",
"Type": "A",
"AliasTarget":{
"HostedZoneId": "Z2E726K9Y6RL4W",
"DNSName": "vpce-xxxx.dkr.ecr.ap-northeast-1.vpce.amazonaws.com",
"EvaluateTargetHealth": false
}
}
},
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "*.dkr.ecr.ap-northeast-1.amazonaws.com.",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [
{
"Value": "dkr.ecr.ap-northeast-1.amazonaws.com"
}
]
}
}
]
}' \