以前に試していたLambdaのカスタムランタイムイメージからの実行ですが、結構便利だったのでテンプレート化してみました。
手動でLambdaを作成しようとするとロールの作成や細かな設定が大変なので、CloudFormation化するメリットは大きいですね。
今回のサンプルでは、EC2インスタンスに「delete」というタグが設定されていて「true」という値が入っている場合には削除するLambdaを作成して、毎日24時に実行するような構成になります。
検証用のインスタンスの消し忘れ防止や、TrustedAdvisorで検知した無駄なインスタンスの削除を自動化する場合などに役立ちますね。
もちろん必要に応じてスクリプトを書き換えれば、いろんなことができますのでぜひ試してみてください。
◆Github (テンプレートはこちら)
https://github.com/noname-work/aws-cloudformation/tree/master/lambda/lambda-for-docker
事前準備
Lambdaで利用するためのコンテナイメージを用意しておく必要があります。
ECRを作成して、docker pushコマンドでLambdaで実行したいイメージをアップロードしておきましょう。
◆ECRリポジトリを作成するテンプレート
https://github.com/noname-work/aws-cloudformation/blob/master/lambda/lambda-for-docker/template/create-ecr-repo.yml
◆サンプルのDockerfile
https://github.com/noname-work/aws-cloudformation/tree/master/lambda/lambda-for-docker/source
Lambda作成時のパラメータ
LambdaName | Lambda関数の名前を設定します。 |
LambdaEcrUri | Lambdaを立ち上げるためのコンテナイメージのURIを指定します。 |
EventTimeCron | Lambdaを定期実行させるためのcron式を入力します。 |
EnvTagName | 今回のシェルスクリプトで利用する環境変数です。EC2インスタンスのタグのキーを指定します。 |
EnvTagValue | 今回のシェルスクリプトで利用する環境変数です。EC2インスタンスのタグの値を指定します。 |
CloudFormationの実行が完了すると、CloudWatchEventsの定期実行処理とLambda用のIAMロール、そしてLambda関数が構築されます。
動作確認
動作を確認するため、タグにkey:delete value:trueを設定したインスタンスを2台とタグを設定していないインスタンスを用意しました。
Lambdaをテストモードで実行してみます。
Lambda実行後、無事に対象のインスタンスのみが削除されることを確認できました。
おわりに
Lambda関数でスクリプトを動かしたいときに、いちいちZipで環境を固めてアップロードするのは手間ですよね。
私も最近、会社で原因不明のメモリリークが発生した時に暫定対応としてCloudWatchAlarmとLambdaを使ったサーバーのリフレッシュを急ぎで実装したのですが結構手間がかかりました。
そこでコンテナイメージでLambdaを構築する汎用的なテンプレートが欲しいなと思ったので、学習がてら朝活で書いてみた感じです。
今回はアラームに基づく実行ではなく単純なcron実行ですが、時間があればアラームに反応するLambdaも用意しておきますね。
コメントを残す