はじめに
AWS CodePipeline 全然わからないので調査
参考
- 【AWS】CodePipelineから呼び出したLambdaがずっと進行中になっている問題と対応
- CodePipeline で パイプラインに AWS Lambda 関数を呼び出す
- CodePipelineからAWS Lambdaを呼び出してCloudFrontのキャッシュを削除(Invalidation)してみた
構成図
こんなの作る。
やること
Code PipelineのStage
にLambdaを登録してみる。ハローワールド的な動作確認までやる。Source
とDeploy
は適当に設定。
Stageで思った通りに(しょぼい)Lambdaが動くことを確認する
1.検証の準備
検証に必要な準備をする。いわゆる環境構築
1-1.IAMポリシーを作る
作成するLambdaに与える権限CodePipelineLambdaExecPolicy
を作る。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:*"
],
"Effect": "Allow",
"Resource": "arn:aws:logs:*:*:*"
},
{
"Action": [
"codepipeline:PutJobSuccessResult",
"codepipeline:PutJobFailureResult"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
以下ができるポリシー
- codepipelineに、SuccessとFailureを返せるようにする
- CloudWatchにログ出力できるようにする
1-2.IAMロールを作る
先ほど作成したIAMポリシーCodePipelineLambdaExecPolicy
をLambdaに適用できるようIAMロールCodePipelineLambdaExecPolicy
を作る。IAMポリシー作成時、AWSサービス lambda
を選択する。
1-3.Lambdaを作る
Python3.8を選択し、Lambdaを作る。IAMロールは、CodePipelineLambdaExecPolicy
を選択する ←重要。
1-4.CodePipelineを作る
Stage
にLambdaを設定する以外は、適当に設定。今回は、CodeCommitのリポジトリ内のデータをS3にpushするように設定したけど、動くならなんでもいい。
2.検証(1) スクリプトの成功/失敗やってみる
Lambdaスクリプトの成功と失敗の動きをやってみる。
2-1.成功を返すスクリプト
今回のメイン、Lambdaスクリプトを書いていく。
import json
import boto3
def lambda_handler(event, context):
codepipeline = boto3.client('codepipeline')
# CodePipelineに結果(成功)を返す
codepipeline.put_job_success_result(jobId = event['CodePipeline.job']['id'])
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda! Error')
}
CodePipelineの変更をリリースする
を実行し、成功しました
と表示されたら成功
2-2.失敗を返すスクリプト
import json
import boto3
def lambda_handler(event, context):
codepipeline = boto3.client('codepipeline')
# CodePipelineに結果(失敗)を返す
codepipeline.put_job_failure_result(
jobId = event['CodePipeline.job']['id'],
failureDetails={
'type': 'JobFailed',
'message': 'Failed test.'
}
)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda! Error')
}
失敗しました
と表示されれば成功
3.検証(2) CodePipelineアクションデータからの情報をLambdaで受け取ってログ出力
CodePipelineアクションデータからの情報をLambdaで受け取ってログ出力してみる
↑のユーザーパラメータに登録した内容がこれ↓ (ホントは改行してない)
{
"PipelineName": "example-pipeline",
"DistributionId": "E1EVDTCEXAMPLE",
"SnsTopicArn": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:example-topic"
}
Lambdaスクリプト(Python3.8)はこれ
import boto3
import json
import logging
import time
import traceback
logger = logging.getLogger()
logger.setLevel(logging.INFO)
cp = boto3.client('codepipeline')
cf = boto3.client('cloudfront')
sns = boto3.client('sns')
def lambda_handler(event, context):
codepipeline = boto3.client('codepipeline')
job_id = event['CodePipeline.job']['id']
job_data = event['CodePipeline.job']['data']
user_parameters = json.loads(
job_data['actionConfiguration']['configuration']['UserParameters']
)
pipeline_name = user_parameters['PipelineName']
distribution_id = user_parameters['DistributionId']
sns_topic_arn = user_parameters['SnsTopicArn']
logger.info('[TEST] job_id = %s', job_id)
logger.info('[TEST] job_data = %s', job_data)
logger.info('[TEST] pipeline_name = %s', pipeline_name)
logger.info('[TEST] distribution_id = %s', distribution_id)
logger.info('[TEST] sns_topic_arn = %s', sns_topic_arn)
# CodePipelineに結果(成功)を返す
codepipeline.put_job_success_result(jobId = event['CodePipeline.job']['id'])
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda! Error')
}
実行結果
↑の詳細
をクリックしてCloudWatchログを確認する
ログに記録されてたら成功
今回は、ここまででおわり。
ホントにハローワールドしかできなかった、調査はつづく
次は、Souceの情報をStageでチェックするスクリプトを作りたい