2020/10/25

AWS LambdaでCodeCommitイベント発生時にCloudWatchへ通知する

この記事ではAWS Lambda関数を使って、CodeCommitのリポジトリ上の変更通知をCloudWatchのログ上に出力する方法を解説していきます。CodeCommitで何かしらのイベントがあった時に通知をしてみたい方、AWS認定試験を受けようとしている方必見です!

CodeCommitを使用した経験がないという方やCodeCommit上にまだリポジトリを作成していないという方はこちらの記事もご覧ください!

Lambda関数を作成する

まずはCodeCommitのトリガーに使用するLambda関数を作成していきます。

AWS Lambdaのコンソール画面を開いてください。

Lambdaのコンソール画面を開いたら、「関数の作成」ボタンをクリックして、関数を作成していきます。

関数の作成

「一から作成」を選択し、関数名を入力します(今回は「lambda-codecommit」とします)。

一から作成

「ランタイム」は「Python 3.7」を選択します。今回は詳細設定などはせず、関数名とランタイムを入れたら、「関数の作成」ボタンをクリックしましょう。

ランタイム

関数の作成が完了しました。次に「トリガーを追加」ボタンをクリックして、トリガーを追加していきましょう。

トリガーを追加

トリガーには「CodeCommit」を選択しましょう。

そして、対象のCodeCommitのリポジトリ名を選択します。

トリガー名は任意の名前をつけましょう(今は「LambdaTrigger」)。

イベントは通知を発生させたい時のイベントを選択します(今回は「すべてのリポジトリイベント」)。

また、ブランチ名は通知を発生させる対象となるブランチを選択します(今回は「すべてのブランチ」)。

カスタムデータなどは今回は特に設定せずにいきます。

一通り入力が終わったら「追加」ボタンをクリックし、トリガーを追加しましょう。

トリガー設定

次に「関数コード」を入力していきます。

LambdaでCodeCommitのトリガーを作成するAWSガイド内のPythonのコードをそのまま関数コードに入力します。

関数コード

※以下コードです。

import json
import boto3

codecommit = boto3.client('codecommit')

def lambda_handler(event, context):
    #Log the updated references from the event
    references = { reference['ref'] for reference in event['Records'][0]['codecommit']['references'] }
    print("References: "  + str(references))
    
    #Get the repository from the event and show its git clone URL
    repository = event['Records'][0]['eventSourceARN'].split(':')[5]
    try:
        response = codecommit.get_repository(repositoryName=repository)
        print("Clone URL: " +response['repositoryMetadata']['cloneUrlHttp'])
        return response['repositoryMetadata']['cloneUrlHttp']
    except Exception as e:
        print(e)
        print('Error getting repository {}. Make sure it exists and that your repository is in the same region as this function.'.format(repository))
        raise e

ソースコードの入力が完了したら「Deploy」ボタンをクリックして、変更を保存しましょう。

Deploy

次に「テスト」ボタンをクリックしてテストイベントを作成していきます。

テスト

「新しいテストイベントの作成」を選択し、イベントテンプレート(今回は「codecommit-repository」)、イベント名(今回は「SampleCodeCommit」)を入力し、JSON形式でイベントを設定していきます。

新しいテストイベントの作成



以下がテストイベントのJSONの例です。適宜編集して設定してください。

{
  "Records": [
    {
      "awsRegion": "ap-northeast-1",
      "codecommit": {
        "references": [
          {
            "commit": "5c4ef1049f1d27deadbeeff313e0730018be182b",
            "ref": "refs/heads/master"
          }
        ]
      },
      "customData": "this is custom data",
      "eventId": "5a824061-17ca-46a9-bbf9-114edeadbeef",
      "eventName": "TriggerEventTest",
      "eventPartNumber": 1,
      "eventSource": "aws:codecommit",
      "eventSourceARN": "arn:aws:codecommit:ap-northeast-1:123456789012:my-repo",
      "eventTime": "2016-01-01T23:59:59.000+0000",
      "eventTotalParts": 1,
      "eventTriggerConfigId": "5a824061-17ca-46a9-bbf9-114edeadbeef",
      "eventTriggerName": "my-trigger",
      "eventVersion": "1.0",
      "userIdentityARN": "arn:aws:iam::123456789012:root"
    }
  ]
}

設定が一通り完了したら、「保存」ボタンをクリックしてください。

先ほど作成したイベント名(今回は「SampleCodeCommit」)を選択し、「テスト」ボタンをクリックします。

テスト保存

テストが成功したようです。

テスト成功

以上でLambda関数の作成は完了です!

動作確認

では実際にCodeCommit上のリポジトリに変更を加えて、先ほど作成したLambda関数が実行されるかどうか動作確認していきたいと思います。

CodeCommitのコンソール画面上でソースコードに変更を加えて、masterブランチにコミット&プッシュをしていきます。

CodeCommit変更

CloudWatchのロググループを確認してみると、先ほど作成した「/aws/lambda/<Lambda関数の関数名(今回はlambda-codecommit)>」でロググループが作成されているので、クリックして詳細を確認しにいきます。

ログストリームが作成されていますね。

CloudWatchのロググループ

出力されてますね!!!!

CloudWatch出力

まとめ

いかがでしたでしょうか?

Lambda関数を使用してCodeCommit上のソースコードの変更をCloudWatchのログに出力させることができましたね。これを応用して、masterブランチへのマージなど特定のイベントが発生した際に、Slackやメールで通知することができます。