はじめに
CodePipeLineが終わったらSlackに通知を送るために、最後にLambda呼び出したかった。
作成したものを備忘として記録。
テンプレート
# CodePipeLine
Pipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
・・・(lambda以外は省略)
Stages:
・・・(lambda以外は省略)
- Name: lambda
Actions:
- Name: lambda
ActionTypeId:
Category: Invoke
Owner: AWS
Version: 1
Provider: Lambda
Configuration:
FunctionName: slack-function # 呼び出したいLambdaの関数名
UserParameters: 'lambda' # Lambdaにパラメータを渡したいときだけ設定する
RunOrder: 1
LambdaでUserParametersを取得する方法(Python)
けっこう深いところにいます。。
def lambda_handler(event, context):
# paramにテンプレートで設定した文字列lambdaが取得されます。
param = event['CodePipeline.job']['data']['actionConfiguration']['configuration']['UserParameters']
LambdaからCodePipeLineに結果を返す方法
Lambdaから結果を返さないとCodePipeLine上でLambdaがずっと実行中のままとなり、1時間のタイムアウトまで実行中になってしまいます。
コード
import boto3
# CodePipeLineのクライアント
code_pipeline = boto3.client('codepipeline')
# job_idの取得
job_id = event['CodePipeline.job']['id']
try:
# 成功したとき
code_pipeline.put_job_success_result(jobId=job_id)
except:
# 失敗したとき
code_pipeline.put_job_failure_result(jobId=job_id, failureDetails={'message': "任意の文字列", 'type': 'JobFailed'})
IAMポリシー
成功/失敗を返す権限が必要です。
下記の2つの許可が必要です。
{
"Action": [
"codepipeline:PutJobSuccessResult",
"codepipeline:PutJobFailureResult"
],
"Effect": "Allow",
"Resource": "*"
}