LoginSignup
11
9

More than 5 years have passed since last update.

Route53 上の DNS レコードを、GitHub 上の JSON ファイルで管理できるようにした

Last updated at Posted at 2017-03-27

僕は、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
11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9