AWS CodePipeline勉強メモ① ハローワールド


はじめに

AWS CodePipeline 全然わからないので調査

参考

構成図

こんなの作る。

やること

Code PipelineのStageにLambdaを登録してみる。ハローワールド的な動作確認までやる。SourceDeployは適当に設定。
Stageで思った通りに(しょぼい)Lambdaが動くことを確認する

1.検証の準備

検証に必要な準備をする。いわゆる環境構築

1-1.IAMポリシーを作る

作成するLambdaに与える権限CodePipelineLambdaExecPolicyを作る。

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)はこれ

lambda-test02
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でチェックするスクリプトを作りたい