Amazon Route 53 Private Hosted Zoneを異なるAWSアカウントに設定する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
本日、Route 53 Private Hosted Zoneが異なるAWSアカウントのVPCに紐付けできるようになりました。以前紹介した以下の記事のアップデートですね。

Route 53 Private Hosted Zoneとは

Route 53は、AWSの仮想ネットワークであるVPCにPrivate Hosted Zoneを紐付けることができます。VPC内部のリソースへの独自のホスト名付与や、VPC内部のEC2のみへの特定ドメインのDNS情報提供などで利用できます。同一アカウントのVPCであればRoute 53の管理画面から、以下のようにVPCを選択、紐付けします。

route53-privateotheraccount01

設定手順

異なるAWSアカウントのVPCにPrivate Hosted Zoneを紐付ける手順は、以下の通りです。

  1. Private Hosted Zoneを持つアカウントに対してCreateVPCAssociationAuthorization APIをコールする。
  2. 紐付けるVPCを持つアカウントに対してAssociateVPCWithHostedZone APIをコールする

いずれの手順も現時点ではAWS Management Console(Web管理画面)ではサポートされていません。AWS CLIや各種AWS SDKを利用しましょう。

1. CreateVPCAssociationAuthorization APIの呼び出し

前述の通り、Private Hosted Zoneを持つアカウントでVPCの紐付け許可を行います。aws route53 create-vpc-association-authorizationコマンドで実行します。

2017/02/09 AWS CLIがCreateVPCAssociationAuthorization APIをサポートしていたので、AWS CLIの手順を追加しました。

$ aws route53 create-vpc-association-authorization \
  --hosted-zone-id XXXXXXXXXXXX \
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-XXXXXXXX
$

これでOKです。

参考: AWS CLIを使わずにNode.jsでAPIを直接コールする(飛ばしてください)

Node.jsでAWS V4署名を簡単に行えるNodeモジュール( https://github.com/mhart/aws4 )を利用しました。

var http  = require('http'),
    https = require('https'),
    aws4  = require('aws4')

var hostedZoneId = 'XXXXXXXXXXX';
var vpcId = 'vpc-XXXXXXXX';

var xml = '<?xml version="1.0" encoding="UTF-8"?>'
        + '  <CreateVPCAssociationAuthorizationRequest xmlns="https://route53.amazonaws.com/doc/2013-04-01/">'
        + '    <VPC>'
        + '      <VPCId>' + vpcId + '</VPCId>'
        + '      <VPCRegion>ap-northeast-1</VPCRegion>'
        + '    </VPC>'
        + '</CreateVPCAssociationAuthorizationRequest>';

request(aws4.sign({service: 'route53',
	path: '/2013-04-01/hostedzone/' + hostedZoneId + '/authorizevpcassociation',
	body: xml
}))

function request(o) { https.request(o, function(res) { res.pipe(process.stdout) }).end(o.body || '') }

mhart/aws4では、AWSのAPIキーを環境変数(AWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEY)から読み込むのであらかじめ設定しておきましょう。 実行して以下のようにレスポンスが返ってくればOKです。

$ npm install aws4
(略)
$ node index.js
<?xml version="1.0"?>
<CreateVPCAssociationAuthorizationResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/"><HostedZoneId>XXXXXXXXXXXX</HostedZoneId><VPC><VPCRegion>ap-northeast-1</VPCRegion><VPCId>vpc-XXXXXXXX</VPCId></VPC></CreateVPCAssociationAuthorizationResponse>

2. AssociateVPCWithHostedZone APIの呼び出し

続いて、紐付けを行います。今度はVPCを持つAWSアカウントで作業することに注意しましょう。また、Private Hosted Zoneを設定するためにはVPCの以下2つの設定が有効になっていなければならないので、予め確認しておきましょう。

  • DNS解決
  • DNSホスト名

route53-privateotheraccount04

今回はAWS CLIのaws route53 associate-vpc-with-hosted-zoneコマンドで実行します。手順1とオプションが同じなのが面白いですねw

$ aws route53 associate-vpc-with-hosted-zone \
  --hosted-zone-id XXXXXXXXXXXX \
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-XXXXXXXX
{
    "ChangeInfo": {
        "Status": "PENDING",
        "Comment": "",
        "SubmittedAt": "2016-11-16T01:23:14.485Z",
        "Id": "/change/C12P3FP58AOL2P"
    }
}

こんな感じのレスポンスが返ってくればOKです。しばらく待ち、Private Hosted Zoneのプロパティを確認すると[Associated VPCs]に、紐付けたVPCが追加されていることが確認できます。

route53-privateotheraccount03

設定できてますね。

まとめ

Route 53 Private Hosted Zoneで異なるAWSアカウントのVPCに紐付ける方法をご紹介しました。開発と本番でAWSアカウントを分けているケースなどで上手く活用できると良いと思います。