Jenkinsを導入したEC2インスタンスに常に同じ名前でアクセスする

2015.02.20

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

こんにちは、虎塚です。

先日このブログで公開された次の記事、読んでくださったでしょうか?

開発プロジェクトのCIサーバをEC2で運用し、CIサーバ起動時にそのPublic IPアドレスをプロジェクトのBacklogに書き込むという内容です。便利ですが、IPアドレスでなく名前でアクセスできると、もっと便利ですよね。

というわけで、今回はその方法をご紹介します。

概要

前回紹介された仕組みのおさらい

前回の記事で紹介された仕組みは、次のとおりです。

EC2の起動ごとにPublic IPアドレスをBacklogに書き込む

EC2に自動的にアサインされるPublic IPアドレスを、CIサーバ起動時にBacklog wikiへ書き込んでいました。

自動化された良い方法ですが、IPアドレスはたいていの人にとって覚えづらいのが難点です。BacklogでIPアドレスを確認しなくても、Jenkins先生のダッシュボードにアクセスできた方が、なにかと便利ではないでしょうか。

今回紹介する仕組み

今回の記事でご紹介する仕組みは、次のとおりです。

EC2の起動ごとにRoute 53のレコードを更新する

自動的にアサインされるPublic IPアドレスを、サーバ起動時にRoute 53に反映します。これによって、常に同じ名前でCIサーバにアクセスできます。もし組織のドメインがexample.comなら、jenkins.project-name.example.comなどにしておけば、覚えやすいでしょう。

ただ、状況によっては、独自ドメイン(サブドメイン)が必要になることが難点かもしれません。組織の公式サイトのサブドメインなどを、ネットワーク管理者から開発環境用に払い出してもらいましょう。

幸いクラスメソッドでは検証用にサブドメインを使えますので、今回はそれを使って設定方法を解説します。

設定方法

CIサーバ用EC2の起動

ここでのポイントは、次の2点です。

  1. Public IPアドレスを自動アサインする設定にする
  2. Route 53のChangeResourceRecordSetsアクションを実行できるIAMロールを付与する

EC2作成時のポイント

1点目は、前回紹介された記事でも実施していた内容ですね。自動アサインされるPublic IPアドレスは起動ごとに異なるものになるので、その都度Route 53に登録し直します。

2点目は、Route 53のレコード変更処理をEC2内部から実行するために、アクセス権限が必要だからです。セキュリティを強固にしたいなら、ピンポイントでChangeResourceRecordSetsアクションを許可するポリシーで、IAMロールを作成するとよいでしょう。今回は、検証用におおまかでよいということにして、PowerUser権限を持つIAMロールを紐づけました。

EC2が起動したら、Public IPアドレスを確認しておきます。

更新対象のレコードセットの登録

CIサーバ用のレコードセットをRoute 53に登録しましょう。CIサーバ起動時に更新対象とするレコードです。

今回は、すでにRoute 53に登録済みのドメイン(サブドメイン)のサブドメインとして登録します。

EC2起動時に更新対象とするAレコードの作成

  • Name: jenkins.project-name.example.com.など(ここではキャプチャのとおり)
  • Type: A
  • TTL (Seconds): 60
  • Value: 先ほど起動したEC2のPublic IPアドレス

CIサーバは組織内のプロジェクトで利用するので、アクセス数は少ないという想定から、TTLを短くしています。

起動時スクリプトの作成

次のようなスクリプトを作成し、CIサーバに設置します。

/etc/init.d/route53-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もぜひ活用しましょう。

それでは、また。