僕は、Wacker というコミュニティで活動していて、最近そのコミュニティでいくつかのプロジェクトをはじめて、それに対するサブドメインを GitHub Pages などで発行するシチュエーションがありました。
そこで、コミュニティドリブンな感じでうまいことDNS サーバー上のサブドメインの管理を自動化できないかなーと思い、GitHub 上にある JSON をもとに DNS レコードをアップデートするようにしてみました。
上のリポジトリをフォークして以下の要領で適当にカスタマイズしてください。
仕組み
GitHub 上に以下のような JSON をコミットします。
{
"records": [
{
"Name": "wacker.io",
"Type": "A",
"TTL": "300",
"ResourceRecords": [
{
"Value": "192.30.252.153"
},
{
"Value": "192.30.252.154"
}
]
},
{
"Name": "wmap.wacker.io",
"Type": "CNAME",
"TTL": "300",
"ResourceRecords": [
{
"Value": "wakayama-hacker.github.io"
}
]
},
{
"Name": "latlng.wacker.io",
"Type": "CNAME",
"TTL": "300",
"ResourceRecords": [
{
"Value": "wakayama-hacker.github.io"
}
]
},
{
"Name": "kushimap.wacker.io",
"Type": "CNAME",
"TTL": "300",
"ResourceRecords": [
{
"Value": "miya0001.github.io"
}
]
}
]
}
records
に配列で DNS レコードを保存してることがわかると思います。
あとは、これを node で作ったスクリプトで読み込んで、Route53 の API を蹴っ飛ばす感じ。
$ npm install
$ npm run deploy
スクリプトのソースは以下の URL にあります。
Travis CI で自動発火
あとは Travis CI で master
にマージされるたびに発火するようにします。
IAM でユーザーをつくる
Travis CI から Route53 の API を蹴っ飛ばすようにポリシーを作ります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1490535720000",
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets",
"route53:ListResourceRecordSets"
],
"Resource": [
"arn:aws:route53:::hostedzone/<Your Hosted Zone ID>"
]
}
]
}
万が一の時のために、対象のゾーンを限定しています。
Travis CI でリポジトリを有効化
Travis CI で対象となる GitHub リポジトリを有効化し、さらに以下のように IAM 用のアクセスキー等を環境変数として登録します。
登録すべき環境変数は以下の通りです。
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
HOSTED_ZONE_ID
HOSTED_ZONE_ID
は、Route53 の DNS のゾーンに割り当てられてる ID です。
AWS CLI をセットアップ済みであれば以下のコマンドで取得できます。
$ aws route53 list-hosted-zones
.travis.yaml
.travis.yml
には以下のように記述します。
language: node_js
node_js:
- '7.6'
branches:
only:
- master
before_script:
- npm install
script:
- npm run deploy
ローカルで試す
ローカル環境でためすには direnv
が便利です。
$ brew install direnv
あとは、プロジェクトのディレクトリに以下のような内容のファイルを .envrc
というファイル名で設置してください。
.envrc
は絶対に GitHub にあげたらダメです。
export HOSTED_ZONE_ID=xxxx
export AWS_ACCESS_KEY_ID=xxxx
export AWS_SECRET_ACCESS_KEY=xxxx