0
0

github enterprise × codebuild でビルドプロセスを自動化する -後編-

Posted at

はじめに

こちらの前編で、githubとECRの更新までを実施しました!
lambdaの更新は手動で実施する方法を記載しましたが、後編ではそのパートを自動化します。
これにより、ローカルからgithubにpushすると、対象のlambdaまで自動で更新できるようになります!
https://qiita.com/JamyJamy/items/e79c6c4b632162c26f96

アーキテクチャ概要

前編で実施したECRの更新をトリガーに、EventBridgeを呼び出します。
そして、そのEventBridgeが、対象となるlambdaを更新するlambdaを作成することで、アプリケーションコードの更新が自動化されます!
スクリーンショット 2023-10-15 23.24.37.png

実装例

更新用Lambda

EventBridgeから呼び出される更新用Lambdaを作成します!
こちらについてはシンプルにコードを書くだけなので、動いた例として記載します!
今回の例だと、マッピング用にdicやlistを用意して、新しい機能が追加されるたびに、こちらにも追記していくような形になります!
(アプリケーションにもよりますが、もう少しいい方法はありそうですね、、)

大まかな流れとしては、以下のような処理になっています!

  • EventBridgeからのイベント情報を取得(ECRリポジトリ名)
  • 取得したリポジトリ名と、更新するlambda関数名をマッピング
  • マッピングしたLambda関数のイメージを更新

Lambda関数の更新に関係あるECRかどうかは、この関数内で判断しています。
EventBridgeのルールで追加してもOKですが、今回は一括で関数内で判定してしまいます!

lambda_updage
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
  • 「パターンを編集」で書き込む
    • イベントソースの下でも、GUIで設定ができます!
      スクリーンショット 2023-10-15 23.35.19.png
イベントパターン例
{
  "source": ["aws.ecr"],
  "detail-type": ["ECR Image Action"],
  "detail": {
    "result": ["SUCCESS"]
  }
}
  • 「ターゲットを選択」でLambda関数を選択
  • 上記で作成した、更新用Lambda関数を選択
  • 「ルールを作成」を選択

おわりに

これで、前編と合わせて、git pushからLambda関数を自動で更新することができました!

このパイプラインの実装方法は他にもありますが、Dockerを使ったパイプラインで、git-CodeBuild-ECR-EventBridge-lambdaで実装している記事は見つけられなかったので、ご参考になれば幸いです!

お読みいただき、ありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0