CodeDeployのhookのLambdaについて

もくじ

前回の記事でCodedeployのデモを紹介しました。

そのときにCodedeployのhookの説明を忘れていたので追加します!

Lambdaをデプロイする場合のhookについて

まずCodedeployの話を少々。

Codedeployはデプロイの作業中に何回かタスクは挟んで実行できます。

タスクを挟めるタイミングは決まっており、この仕組をhookとか呼びます。

デプロイ1回中のhookのタイミングや数は、デプロイ対象によって変わります。

デプロイ対象がLambdaの場合はは2回です。そしてタイミングは下記の通りです。

詳細はこのへんを参照ください

そして前回の記事のデモでは、hookにLambdaを関数を入れてました。

Lambdaの中身はこんな感じ。

import json

import boto3

STATUS_SUCCEEDED = "Succeeded"
codedeploy = boto3.client("codedeploy")


def pre_hook_handler(event, context):
    print(json.dumps(event))
    # {
    #     "DeploymentId": "d-XXXXXXXXX",
    #     "LifecycleEventHookExecutionId": "xxxxxxxxxxxxxxxxxxxxxxxx"
    # }
    print("デプロイ開始したよ!")
    codedeploy.put_lifecycle_event_hook_execution_status(
        deploymentId=event["DeploymentId"],
        lifecycleEventHookExecutionId=event["LifecycleEventHookExecutionId"],
        status=STATUS_SUCCEEDED,
    )


def post_hook_handler(event, context):
    print(json.dumps(event))
    # {
    #     "DeploymentId": "d-XXXXXXXXX",
    #     "LifecycleEventHookExecutionId": "xxxxxxxxxxxxxxxxxxxxxxxx"
    # }
    print("カナリアテスト終わったよ!")
    codedeploy.put_lifecycle_event_hook_execution_status(
        deploymentId=event["DeploymentId"],
        lifecycleEventHookExecutionId=event["LifecycleEventHookExecutionId"],
        status=STATUS_SUCCEEDED,
    )

pre_hook時のhandlerはpre_hook_handler、post_hook時はpost_hook_handlerを呼ぶようにcdk側で設定してます。

どっちのhandlerでも、ただput_lifecycle_event_hook_execution_statusのAPIを呼んでいるだけです。

このAPIですが、必ず叩いてあげないとだめです。叩かずLambdaを終了させてしまうとCodeDeploy側がtimeoutするまで返答を待ち続けます。(今現在2022/05/27: デフォルト1時間)

このAPIを叩くためにはDeploymentIdLifecycleEventHookExecutionIdStatusが必要です。ただStatus以外はLambdaのEventに入っているなのでLambdaからだとStatusだけ新しく作ってあげればOKです。

ちなみにStatusはこんな↓種類が定義されてます。

Pending | InProgress | Succeeded | Failed | Skipped | Unknown

が、、、APIで利用できるのはSucceededFailedだけです。それ以外使えないっぽいです(笑)

細かいことはのこの辺とかこの辺を御覧ください

なのでStatusは処理が成功したらSucceeded、失敗したらFailedを返してあげましょう。

以上でした!

今回のリポジトリはこちら

前回と同じ。

https://github.com/sisi100/cdk_lambda_canaria_demo

Author

Sisii

AWSが好きなフリーランスのエンジニア。主にAWSを使ったバックエンドの開発をしています😊最近Frontも始めました