awscliでRoute53にレコードを登録する(A、ALIAS、CNAME)
Route53、使いますよね。
イメージ的にEC2、RDS、S3と同じくらい使うんじゃないでしょうか。
普通はAWSマネージメントコンソールが使えると思いますが、いつも恵まれた環境ではなかったりします。請負で何個もAWSアカウントを持っていたり、お客さんのセキュリティポリシー的に縛られていたり、帰り間際ですでにブラウザを落としていてログインするのがめんどくさかったり……
そんな時はawscli使ったろうやないかい!というエントリーです。
jsonファイルを作ってバーンッという手順です。
ネット上では意外に単純なパターンが見つからない気がしたので、テンプレートっぽく書いてみました。
やってみる
AWS CLI設定
公式が詳しいです。使えるようにしておきましょう。
jsonファイル編集
以後全てのパターンを以下のファイル名で作成するものとします。
$ vi record.json
ここでは「hogetest.com」というドメインのレコードを登録するjsonを作っていきます。
Aレコードの場合
Aレコード作成
{ "Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": "hogetest.com.", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "IPアドレス" } ] } } ] }
Aレコード更新
{ "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "hogetest.com.", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "IPアドレス" } ] } } ] }
Aレコード削除
{ "Changes": [ { "Action": "DELETE", "ResourceRecordSet": { "Name": "hogetest.com.", "Type": "A", "TTL": 300, "ResourceRecords": [ { "Value": "IPアドレス" } ] } } ] }
ALIASレコードの場合
ALIASレコードって何?というとIPアドレスやドメイン名の代わりにAWSサービスのエンドポイント的な何かが値として設定できるレコードです。(たぶん)
以下はELBに設定するパターンです。
ALIASレコード作成
{ "Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": "hogetest.com.", "Type": "A", "AliasTarget": { "HostedZoneId": "ELBのホストゾーンID(※1)", "DNSName": "ELBのDNS名(※2)", "EvaluateTargetHealth": false } } } ] }
ALIASレコード更新
{ "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "hogetest.com.", "Type": "A", "AliasTarget": { "HostedZoneId": "ELBのホストゾーンID(※1)", "DNSName": "ELBのDNS名(※2)", "EvaluateTargetHealth": false } } } ] }
ALIASレコード削除
{ "Changes": [ { "Action": "DELETE", "ResourceRecordSet": { "Name": "hogetest.com.", "Type": "A", "AliasTarget": { "HostedZoneId": "ELBのホストゾーンID(※1)", "DNSName": "ELBのDNS名(※2)", "EvaluateTargetHealth": false } } } ] }
CNAMEレコードの場合
CNAMEレコードって何?というと「Canonical Name」ということらしいです。
そうなるとCanonicalって何?という話になってきますが、ググると「正典の、教会法に基づく、規準的な、標準的な」と出てきます。
よくわからないですね。よくわからないのにこの「Canonicalうんたら」ってapacheとかでも出てくるんですよね。。一番前に来てる意味でそのまま「正典の名前」と解釈することにします。
「正典の名前」に差し向けるので、「あだ名」→「本名(正典の名前)」みたいな感じで考えたらいいんじゃないでしょうか。(たぶん)
CNAMEレコード作成
{ "Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": "hogetest.com.", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "ドメイン名" } ] } } ] }
CNAMEレコード更新
{ "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "hogetest.com.", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "ドメイン名" } ] } } ] }
CNAMEレコード削除
{ "Changes": [ { "Action": "DELETE", "ResourceRecordSet": { "Name": "hogetest.com.", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "ドメイン名" } ] } } ] }
登録コマンド
$ aws route53 change-resource-record-sets --hosted-zone-id ゾーンID --change-batch file://record.json
※1 ELBのホストゾーンID確認方法
GUI
AWSマネージメントコンソール -> EC2 -> ロードバランサー -> ロードバランサー選択 -> 説明タブのホストゾーン
CLI
$ aws elb describe-load-balancers --load-balancer-name ロードバランサー名 | grep CanonicalHostedZoneNameID
※2 ELBのDNS名確認方法
GUI
AWSマネージメントコンソール -> EC2 -> ロードバランサー -> ロードバランサー選択 -> 説明タブのDNS名
CLI
$ aws elb describe-load-balancers --load-balancer-name ロードバランサー名 | grep DNSName
雑感
TTLは仮に300で設定していますが、そのへんは臨機応変で。。ALIASレコードを設定した時のTTLについてはおそらくこのあたりの記事が参考になります。
今回awscliを使って情報をdescribeする際にgrepで抽出していますが、少し複雑な整形や表示をする際にはjqコマンドが便利です。
あとこれは戒めになりますが、「awscli」とかでググってコマンドリファレンスを調べた時にdescribeとdeleteを間違ってコピペして実行すると痛い目にあうので気をつけましょう。