Lambda + GolangでEC2インスタンス起動時にRoute53へレコード登録する
ありそうでそれっぽいものがなかったので、なら作ろう、ということで勉強中のGolangを使い、こちらの記事を参考にGolangでEC2インスタンスが起動したらRoute53へレコード登録するモノを作ったので、その際にハマったポイントをメモ。
CloudWatch eventsを使ってEC2起動時にTagチェックをし必須TagがなければTerminateするLambdaサンプル - Qiita
最重要事項:ドキュメントをよく読む。
Lambda 関数ハンドラ (Go) - AWS Lambda
今回はCloudWatchEventを使ってLambdaをキックするだけ。流れは、
- CloudWatchEventでキックされたLambdaは例にしたがってlambda.startする
- lambda.startで指定したハンドラの第2引数はgithub.com/aws/aws-lambda-go/eventsのCloudWatchEvent
- CloudWatchEventからインスタンスの情報を取得
- 3で取得した情報を基にRoute53へレコード登録
と簡単なモノ。既にレコードがある場合はエラーになります。更新とか出来るけど、意図せず変わってしまうのも危険なので割り切って新規登録だけに。
真っ先に参考にさせてもらったサイト。
AWS LambdaにGoサポートが入ったので使ってみた | ブログ :: Web notes.log
流れの2では第2引数でCloudWatchEventが取れるということすらわからず1、2時間さまよった結果どこかで見たのだけど、メモするのを忘れた。。。
func Handler(ctx context.Context, event events.CloudWatchEvent) () {
...
}
とりあえず色々なイベントがあらかじめ定義されていて引数に取れるようです。参考サイトの情報から、もしかしたら、という予想でやってみたらうまく行った、という流れの可能性もあったかもしれないけど、どこか参考ページと思われるところがあれば紹介してもらえると助かります。
流れの3ではこちらの記事を参考にインスタンスの情報を取ることに成功。
AWS SDK for Go でEC2インスタンス情報取得 - Qiita
コピペしただけでは意味がないのでドキュメントも読み、理解を深める。ただ、2でインスタンスのIDが取れているので、全インスタンスの情報を取得するのはよろしくない、ということでインスタンスIDを基に情報を取得した。(絞り込み出来てるはず・・・
ec2 - Amazon Web Services - Go SDK
流れの4はひたすらドキュメントを読み解き、最終的にドキュメントにサンプルコードがあり、それを参考にすることでレコード登録が出来た。
route53 - Amazon Web Services - Go SDK
Readmeとか英語にしないと!と思ったけど意味通じなくなるので、開き直って日本語で書きました。