Jenkinsを導入したEC2インスタンスに常に同じ名前でアクセスする
こんにちは、虎塚です。
先日このブログで公開された次の記事、読んでくださったでしょうか?
開発プロジェクトのCIサーバをEC2で運用し、CIサーバ起動時にそのPublic IPアドレスをプロジェクトのBacklogに書き込むという内容です。便利ですが、IPアドレスでなく名前でアクセスできると、もっと便利ですよね。
というわけで、今回はその方法をご紹介します。
概要
前回紹介された仕組みのおさらい
前回の記事で紹介された仕組みは、次のとおりです。
EC2に自動的にアサインされるPublic IPアドレスを、CIサーバ起動時にBacklog wikiへ書き込んでいました。
自動化された良い方法ですが、IPアドレスはたいていの人にとって覚えづらいのが難点です。BacklogでIPアドレスを確認しなくても、Jenkins先生のダッシュボードにアクセスできた方が、なにかと便利ではないでしょうか。
今回紹介する仕組み
今回の記事でご紹介する仕組みは、次のとおりです。
自動的にアサインされるPublic IPアドレスを、サーバ起動時にRoute 53に反映します。これによって、常に同じ名前でCIサーバにアクセスできます。もし組織のドメインがexample.comなら、jenkins.project-name.example.comなどにしておけば、覚えやすいでしょう。
ただ、状況によっては、独自ドメイン(サブドメイン)が必要になることが難点かもしれません。組織の公式サイトのサブドメインなどを、ネットワーク管理者から開発環境用に払い出してもらいましょう。
幸いクラスメソッドでは検証用にサブドメインを使えますので、今回はそれを使って設定方法を解説します。
設定方法
CIサーバ用EC2の起動
ここでのポイントは、次の2点です。
- Public IPアドレスを自動アサインする設定にする
- Route 53のChangeResourceRecordSetsアクションを実行できるIAMロールを付与する
1点目は、前回紹介された記事でも実施していた内容ですね。自動アサインされるPublic IPアドレスは起動ごとに異なるものになるので、その都度Route 53に登録し直します。
2点目は、Route 53のレコード変更処理をEC2内部から実行するために、アクセス権限が必要だからです。セキュリティを強固にしたいなら、ピンポイントでChangeResourceRecordSetsアクションを許可するポリシーで、IAMロールを作成するとよいでしょう。今回は、検証用におおまかでよいということにして、PowerUser権限を持つIAMロールを紐づけました。
EC2が起動したら、Public IPアドレスを確認しておきます。
更新対象のレコードセットの登録
CIサーバ用のレコードセットをRoute 53に登録しましょう。CIサーバ起動時に更新対象とするレコードです。
今回は、すでにRoute 53に登録済みのドメイン(サブドメイン)のサブドメインとして登録します。
- Name: jenkins.project-name.example.com.など(ここではキャプチャのとおり)
- Type: A
- TTL (Seconds): 60
- Value: 先ほど起動したEC2のPublic IPアドレス
CIサーバは組織内のプロジェクトで利用するので、アクセス数は少ないという想定から、TTLを短くしています。
起動時スクリプトの作成
次のようなスクリプトを作成し、CIサーバに設置します。
#!/bin/sh # chkconfig: 2345 99 10 # description: test shell HOSTED_ZONE='ABCDEFG1234567' pub_ip="$(curl http://169.254.169.254/latest/meta-data/public-ipv4)" change="$(printf '{"Comment":"CurrentJenkinsServer","Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"jenkins.project-name.example.com.","Type":"A","TTL":60,"ResourceRecords":[{"Value":"%s"}]}}]}' $pub_ip)" case "$1" in start) aws route53 --region ap-northeast-1 change-resource-record-sets --hosted-zone-id $HOSTED_ZONE --change-batch $change ;; stop) ;; *) break ;; esac
HOSTED_ZONEは、Management ConsoleのRoute 53ダッシュボードで確認できます。[Hosted Zones]で一覧を表示し、先ほどCIサーバのAレコードを登録したホストゾーンのHosted Zone IDを確認してください。
pub_ip変数には、EC2自身のパブリックIPアドレスを代入します。前回紹介された記事と同じく、EC2のメタデータを利用します。
AWS CLIを使用して、AWS Route 53 APIでレコードの更新を実行します。
起動時スクリプトの自動実行の設定
chkconfigで上記のスクリプトを登録します。
$ sudo chkconfig --add route53-ci $ sudo chkconfig route53-ci on
おわりに
以上の設定を終えると、CIサーバを起動するたびに、その時のPublic IPアドレスがRoute 53に登録されるようになります。
Backlogには、Aレコードに設定した「jenkins.project-name.example.com」を書いておけばよく、変更の必要はありません。常に同じアドレスでJenkinsにアクセスできます。
開発環境をAWS上に作る場合は、Route 53もぜひ活用しましょう。
それでは、また。