この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
概要
大阪オフィスのちゃだいんです。
手を動かして学ぶために、公式ドキュメントのチュートリアルをやってみました。
今回は、Lambdaチュートリアル第2弾です。内容は以下のものです。
チュートリアル: Amazon S3 で AWS Lambda を使用する
バケットにアップロードされる各画像ファイルのサムネイルを作成するとします。オブジェクトの作成時に Amazon S3 が呼び出すことができる Lambda 関数 (CreateThumbnail) を作成できます。その後、Lambda 関数はソースバケットから画像オブジェクトを読み取り、ターゲットバケットにサムネイル画像を作成できます。
前提条件
AWS CLIが使用できる環境で行ってます。
早速やってみた
1.実行ロールを作成する
- lambda関数にAWSリソースに対して実行権限を付与するIAMロールを作成します。
-
マネジメントコンソールを開き、IAMの画面へ移動します。
-
Role
ページにて、ロールの作成
を選択します。 -
Lambdaの中から
AWSLambdaExecute.
を選び、以下のように作成しました。
2.バケットを作成しサンプルオブジェクトをアップロードする
- バケットを作成し、オブジェクトをアップロードするための手順を行います。
-
S3のコンソール画面を開き、新しくバケットを作成します。
- ソースバケットとターゲットバケットは以下の名前で作成しました。
- ソースバケットには以下の
SpiceCurry.jpg
画像をアップロードします。
- ちなみにこんな画像です。(とても美味しかったです)
3.関数を作成する
- ここではデプロイパッケージを作成し、アップロードして、Lambda関数を作成します。
-
言語は
Python
でやりたいので、下記ページのPython 3
の項目を参考にします。
サンプル Amazon Simple Storage Service 関数コード - AWS Lambda
以下のコード例では、Amazon S3 イベント入力を受け取り、含まれるメッセージを処理します。ソースバケットのイメージのサイズを変更し、ターゲットバケットに出力を保存します。
- どうやら仮想環境で作成した方が良さそうなので、下記エントリを参考にデプロイパッケージ作成するための環境として、まずEC2を立ち上げます。
- 立ち上げたEC2にSSHで接続します。
-
メインのコードはドキュメントにあるものをそのまま
CreateThumbnail.py
というファイル名で作成します。 -
このAMI``ではPythonのバージョンは以下の通りでした。
$ python --version
Python 2.7.16
- 今回のサンプルコードは
Python 3
と書いてあったので、Python 3を入れてみます。
sudo yum install -y python3
- そして仮想環境とやらを作成します。ドキュメントでは
Virtualenv
となってますが、Python3の標準ライブラリであるvenv
を使います。
$ python3 -m venv test-venv
$ source test-venv/bin/activate
- そうすると頭に
(test-env)
が付いたので、仮想環境に入ることができました。
(test-venv) [ec2-user@ip-*********** ~]$
- 仮想環境にライブラリをインストールします。(ドキュメントと同じ)
$ pip install pillow
$ pip install boto3
- lib および lib64 サイトパッケージの内容を .zip ファイルに追加します。(ドキュメントと同じ)
$ cd $VIRTUAL_ENV/lib/python3.7/site-packages
$ zip -r ~/CreateThumbnail.zip .
- .zip ファイルに Python コードを追加します。(ドキュメントと同じ)
$ cd ~
$ zip -g CreateThumbnail.zip CreateThumbnail.py
- 作成した.zipファイルをローカルにコピーします。
$ scp -i .ssh/testkey.pem ec2-user@**********:~/CreateThumbnail.zip ~/desktop
create-function
コマンドを使用してLambda関数を作成します。
$ aws lambda create-function --function-name CreateThumbnail \
--zip-file fileb://~/desktop/CreateThumbnail.zip
--handler CreateThumbnail.handler \
--runtime python3.7 --timeout 30 --memory-size 1024 \
--role arn:aws:iam::123456789012:role/lambda-s3-role \
--region ap-northeast-1
4.関数をテストする
- サンプルのS3イベントデータを使用して、手動でLambda関数を呼び出してみます。
-
ドキュメントに記載の
InputFile.txt
のsourebucket
とHappyFace.jpg
のみを変更して作成します。
{
"Records":[
{
"eventVersion":"2.0",
"eventSource":"aws:s3",
"awsRegion":"us-west-2",
"eventTime":"1970-01-01T00:00:00.000Z",
"eventName":"ObjectCreated:Put",
"userIdentity":{
"principalId":"AIDAJDPLRKLG7UEXAMPLE"
},
"requestParameters":{
"sourceIPAddress":"127.0.0.1"
},
"responseElements":{
"x-amz-request-id":"C3D13FE58DE4C810",
"x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
},
"s3":{
"s3SchemaVersion":"1.0",
"configurationId":"testConfigRule",
"bucket":{
"name":"190711lambdatest",
"ownerIdentity":{
"principalId":"A3NL1KOZZKExample"
},
"arn":"arn:aws:s3:::190711lambdatest"
},
"object":{
"key":"SpiceCurry.jpg",
"size":1024,
"eTag":"d41d8cd98f00b204e9800998ecf8427e",
"versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko"
}
}
}
]
}
- 実際にやってみました。
$ aws lambda invoke --function-name CreateThumbnail --invocation-type Event \
--payload file://inputfile.txt outputfile.txt --region ap-northeast-1
{
"StatusCode": 202
}
- 一応成功したっぽいです。CloudWatchのログを見てみましょう。
- Errorが出てないのでいけたっぽいです。実際にバケットを見てみましょう。
- ファイルサイズが小さくなったサムネイル画像がターゲットバケットにちゃんと入ってました。
5.S3の設定とイベントの発行
- Lambda 関数のアクセスポリシーに、この関数の呼び出しを Amazon S3 に許可するアクセス権限を追加します。追加前は下図のように何も入ってません。
- Lambda CLI add-permission コマンドを実行します。ドキュメントで赤文字の部分を変更してます。
aws lambda add-permission --function-name CreateThumbnail --principal s3.amazonaws.com \
--statement-id 190711lambdatest-spicecurry --action "lambda:InvokeFunction" \
--source-arn arn:aws:s3:::190711lambdatest \
--source-account 123456789012 \
--region ap-northeast-1
- すると、Lambdaコンソールにて関数ポリシーが追加されました。
- オブジェクト作成イベントをLambdaに発行するように、S3のソースバケットで通知設定を追加します。(わかりづらかったので日本語から英語に切り替えてます)
- 設定が完了すると、Lambdaコンソールにもトリガー側にS3が追加されてました。
6.セットアップをテストする
- いよいよ本番です。これでS3のリソースバケットに画像をアップロードしたら、サムネイル画像がターゲットバケットに作成されるはず。
-
では
VeryHotCurry.jpg
をアップロードしてみます。
- ちなみにまたしてもカレーの写真です。(※見た目によらず相当辛いので注意!!)
- 結果、ちゃんとターゲットバケットにサムネイル画像が作成されてました!めでたしめでたし。
感想
前回よりももう少しわかりやすいサービスっぽい機能が実現できたので、ちょっとテンション上がりました。
誰かのお役に立てば幸いです。それではまた、大阪オフィスのちゃだいんでした。