3分で作る、CloudWatchイベントで実行するLambda

AWS製の Chalice というサーバーレスアプリケーションフレームワークを使用して、CloudWatchイベントで実行するLambdaを爆速で作成します。
2020.04.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回の CloudWatchイベントバージョンです。Chaliceを使ってCloudWatch EventsをトリガーにLambdaを起動してみたいと思います。

環境

  • macOS Catalina 10.15.4
  • Python 3.7.7
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.4
BuildVersion:	19E287

$ python3 -VV
Python 3.7.7 (default, Mar 10 2020, 15:43:33)
[Clang 11.0.0 (clang-1100.0.33.17)]

やってみる

仮想環境の作成

今回は Python で標準機能の venvを利用します。

$ mkdir chalice-example && cd chalice-example
$ python3 -m venv venv

仮想環境の有効化

$ source ./venv/bin/activate
(venv) $

Chaliceのインストール

(venv) $ pip install chalice

プロジェクトの作成

new-projectコマンドを利用してプロジェクトの雛形を作成します。s3-event-lambda フォルダが作成され、各種ファイルが作成されています。

(venv) $ chalice new-project s3-event-lambda

コーディング

app.pyの内容を下記のようにします。

今回は追加のパッケージはありませんので、requirements.txtに追加は不要です。

app.py

from chalice import Chalice
from chalice.app import CloudWatchEvent

app = Chalice(app_name='cwe-lambda')


@app.on_cw_event(
    {
        "source": ["aws.ecr"],
        "detail-type": ["ECR Image Scan"]
    },
    name='ecr-scan')
def ecr_scan(event: CloudWatchEvent):
    print(event.to_dict())

デプロイ

(venv) $ chalice deploy --stage dev
Creating deployment package.
Creating IAM role: cwe-lambda-dev
Creating lambda function: cwe-lambda-dev-ecr-scan
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:cwe-lambda-dev-ecr-scan

作成されたものを確認

Lambda

IAMロール

ポリシーにはログ出力のみの権限が自動で付与されています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}

CloudWatch Eventsルール

動作確認

適当なECRリポジトリを作成し、イメージをプッシュしたのでログを確認します。Lambdaが実行されていることが確認できました。

後片付け

次のコマンドで作成したリソースが削除できます。ロググループは削除されないので手動で消す必要があります。

(venv) $ chalice delete --stage dev

さいごに

前回同様に簡単にCloudWatch Events と連携するLambdaが作成することができました。

参考情報