はじめに
こちらの前編で、githubとECRの更新までを実施しました!
lambdaの更新は手動で実施する方法を記載しましたが、後編ではそのパートを自動化します。
これにより、ローカルからgithubにpushすると、対象のlambdaまで自動で更新できるようになります!
https://qiita.com/JamyJamy/items/e79c6c4b632162c26f96
アーキテクチャ概要
前編で実施したECRの更新をトリガーに、EventBridgeを呼び出します。
そして、そのEventBridgeが、対象となるlambdaを更新するlambdaを作成することで、アプリケーションコードの更新が自動化されます!
実装例
更新用Lambda
EventBridgeから呼び出される更新用Lambdaを作成します!
こちらについてはシンプルにコードを書くだけなので、動いた例として記載します!
今回の例だと、マッピング用にdicやlistを用意して、新しい機能が追加されるたびに、こちらにも追記していくような形になります!
(アプリケーションにもよりますが、もう少しいい方法はありそうですね、、)
大まかな流れとしては、以下のような処理になっています!
- EventBridgeからのイベント情報を取得(ECRリポジトリ名)
- 取得したリポジトリ名と、更新するlambda関数名をマッピング
- マッピングしたLambda関数のイメージを更新
Lambda関数の更新に関係あるECRかどうかは、この関数内で判断しています。
EventBridgeのルールで追加してもOKですが、今回は一括で関数内で判定してしまいます!
import boto3
def lambda_handler(event, context):
#ECRからのイベント情報を取得
event_detail = event.get('detail', {})
#ECRのリポジトリ名を取得
repository_name = event_detail.get('repository-name', None)
#ECRのリポジトリ名にインデックスを付与
ecr_index_dict = {
"ECR_repo1":0,
"ECR_repo2":1,
"ECR_repo3":2
}
#lambda関数のリスト(順番をインデックスと対応させる)
lambda_function_list = [
"Lambda1",
"Lambda2",
"Lambda3"
]
#ECRのURIリスト(順番をインデックスと対応させる)
ecr_uri_list = [
"<account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/<リポジトリ名1>:latest",
"<account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/<リポジトリ名2>:latest",
"<account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/<リポジトリ名3>:latest"
]
#更新対象のLambda関数のECRが更新されたら、Lambda関数を更新
if repository_name in ecr_index_dict:
function_index = ecr_index_dict[repository_name]
lambda_function_name = lambda_function_list[int(function_index)]
image_uri = ecr_uri_list[int(function_index)]
#lambda関数のイメージを最新化
lambda_client = boto3.client('lambda')
response = lambda_client.update_function_code(
FunctionName = lambda_function_name,
ImageUri= image_uri,
)
#try-catchでも良いが、関係ないECRは無視するだけなので一旦printだけ
else:
print("登録なし")
EventBridge
- コンソールからEventBridgeを選択
- ルールを作成
- 任意のイベント名を設定
- 「イベントパターン」以外はデフォルトでOK
- 「パターンを編集」で書き込む
{
"source": ["aws.ecr"],
"detail-type": ["ECR Image Action"],
"detail": {
"result": ["SUCCESS"]
}
}
- 「ターゲットを選択」でLambda関数を選択
- 上記で作成した、更新用Lambda関数を選択
- 「ルールを作成」を選択
おわりに
これで、前編と合わせて、git pushからLambda関数を自動で更新することができました!
このパイプラインの実装方法は他にもありますが、Dockerを使ったパイプラインで、git-CodeBuild-ECR-EventBridge-lambdaで実装している記事は見つけられなかったので、ご参考になれば幸いです!
お読みいただき、ありがとうございました!