LoginSignup
3
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-27

はじめに

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

参考

構成図

こんなの作る。

image.png

やること

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の変更をリリースするを実行し、成功しましたと表示されたら成功

image.png

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')
    }

失敗しましたと表示されれば成功

image.png

3.検証(2) CodePipelineアクションデータからの情報をLambdaで受け取ってログ出力

CodePipelineアクションデータからの情報をLambdaで受け取ってログ出力してみる

image.png

↑のユーザーパラメータに登録した内容がこれ↓ (ホントは改行してない)

{
    "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')
    }

実行結果

image.png

↑の詳細をクリックしてCloudWatchログを確認する

ログに記録されてたら成功

image.png

今回は、ここまででおわり。
ホントにハローワールドしかできなかった、調査はつづく
次は、Souceの情報をStageでチェックするスクリプトを作りたい

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0