【AWS認定 ソリューションアーキテクト】この本で私は受かりました

【Serverless Framework】EC2インスタンス起動時に動的パブリックIPをLambda Rubyでroute53に登録

CloudWatch EventsのEC2インスタンスの起動をトリガーにLambda関数を実行し、起動したEC2インスタンスの動的パブリックIPをroute53のレコードに登録します。また、EC2の停止をトリガーに対象のレコードを削除します。

VPNが接続できない、したくない環境、Elastic IPを節約したいといような個人ユーザにはちょっぴりうれしいかもしれません。興味本位で以下を触りたかったというのが本音で、お題はおまけです。

  • Lambdaでrubyを使ってみたい
  • Serverless Frameworkを使ってみたい

前提条件

前提条件

  • CentOS 7系利用
  • credentialが設定済みであること
  • Serverless Frameworkインストール済み
  • ruby2.5(Lambdaのサポートバージョン)インストール済み

構成図

機能詳細

EC2インスタンスの起動時に以下の2つのタグを利用して、route53のホストゾーンにAレコードを登録します。SetRoute53タグの値がONの時、[Nameタグの値].[ドメイン名]で、動的パブリックIPをroute53のAレコードに登録します。また、EC2インスタンスの停止時に登録されているAレコードの削除を行います。

利用するタグ

  • Nameタグ
  • SetRoute53タグ(値にONを記載)

設定例

項目 設定値
Nameタグ demo-machine
SetRoute53タグ ON
※その他の値やタグ未設定の場合は登録しない
ドメイン名 tekunote.com
登録されるAレコードのFQDN demo-machine.tekunote.com

やってみよう

Serverless FrameworkでLambda関数の作成とデプロイ

Lambda関数の雛型作成

サービス名、作成先のパス共にdynamic-dnsでAWS Lambda のRuby環境の雛型を作成し、対象のパスへ移動します。

dynamic-dnsディレクトリ内に作成されたserverless.ymlhandler.rbの2ファイル利用します。

環境変数の設定

次の手順で、serverless.ymlを設定しますが、以下のパラメータはべた書きせず、環境変数から読み込むようにしていますので設定しておきます。

serverless.yamlの設定

以下の通り設定します。環境変数HOSTED_ZONE_IDDOMAINについてはLambda関数の環境変数に登録されます。serverless.ymlのリファレンスはこちらです。

serverless.yamlの設定内容について補足します。
Lambda関数に割り当てるIAMロールの設定はiamRoleStatements:内で設定しています。Lambda関数にec2:DescribeInstancesroute53:ChangeResourceRecordSetsroute53:ListResourceRecordSetsの権限を設定しています。CloudWatch Logsの操作関連の権限も必要ですが、Serverless Frameworkではデフォルトで付与されるためserverless.yaml内に記載する必要はありません。

CloudWatch Eventのトリガ(EC2起動時に実行)はevents:内で設定しています。

handler.rbの作成

今回作成してみたLambda関数のソースは以下です。handler.rbに上書きします。

デプロイ

CloudFormationスタックdynamic-dns-nonstageが作成され、CloudFormationから各リソースが作成されます。deploy時のオプションの詳細表示(-v)で、CloudFormationからどのリソースが作成されるか確認できますが、今回は指定せずに伏せています。

動作確認

EC2インスタンスにタグを設定し起動

以下のようにEC2インスタンスのタグを設定し、起動してみます。

Route53のレコード確認

IPはマスクしていますが、このような形でレコードが登録されます。

CloudWatch Log確認

こちらもIPはマスクしていますが、このような形で表示されます。

EC2を停止した場合は、登録したAレコードが削除されます。

最後に

Serverless Frameworkが、CloudFormationでデプロイされることさえ、使ってみるまで知らなかったです。。。CloudFormationの変更セット適用するとき、差分チェックやら置換の有無やら結構たいへんだったなぁという思い出に浸りました。読んでいただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA