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を叩くためにはDeploymentId
とLifecycleEventHookExecutionId
とStatus
が必要です。ただStatus
以外はLambdaのEventに入っているなのでLambdaからだとStatus
だけ新しく作ってあげればOKです。
ちなみにStatus
はこんな↓種類が定義されてます。
Pending | InProgress | Succeeded | Failed | Skipped | Unknown
が、、、APIで利用できるのはSucceeded
とFailed
だけです。それ以外使えないっぽいです(笑)
なのでStatus
は処理が成功したらSucceeded
、失敗したらFailed
を返してあげましょう。
以上でした!
今回のリポジトリはこちら
前回と同じ。