Lambdaで取得した画像をKinesis及びFirehose経由でS3にアップロードするにて
流した画像がFirehoseを経由うすると複数の画像がまとめられて出力されたので
KinesisからLambda経由でS3にアップロードしたときの個人メモ
(参考)S3 — Boto3 Docs 1.18.57 documentation - Amazon AWS
(参考)Amazon Kinesis で AWS Lambda を使用する
Kinesis
-
Lambdaで取得した画像をKinesis及びFirehose経由でS3にアップロードするにて
作成したものを流用
Lambda
- Python3.9にて作成
- 自動生成されたロールを選択
- ロールにアタッチされているポリシーを以下のように修正
- S3へのPutObjectを付与
- logsはデフォルトのまま
- ロールに既存ポリシー「AWSLambdaKinesisExecutionRole」をアタッチ
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"logs:CreateLogGroup"
],
"Resource": [
"arn:aws:logs:(リージョン名):(AWSアカウント):*",
"arn:aws:s3:::(バケット名)/*"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:(リージョン名):(AWSアカウント):log-group:/aws/lambda/uploadToS3FromKinesis:*"
}
]
}
- ソース修正
lambda_function.py
import os
import logging
import boto3
import base64
# ログ設定
logger = logging.getLogger(__name__)
logger.setLevel(os.environ['LOG_LEVEL'])
# 環境変数から取得
BACKET_NAME = os.environ['BACKET_NAME']
FILE_PATH = os.environ['FILE_PATH']
# 画像をS3にアップロードする
# img:画像のバイナリデータ
# return:プットした結果
def put_img_to_s3(img):
logger.debug('start put_img_to_s3()')
s3 = boto3.client('s3')
response = s3.put_object(Bucket=BACKET_NAME, Key=FILE_PATH, Body=img)
logger.debug('end put_img_to_s3()')
return response
def lambda_handler(event, context):
logger.debug('start lambda_handler()')
logger.debug('event:' + str(event))
img = base64.b64decode(event['Records'][0]['kinesis']['data'])
result = put_img_to_s3(img)
logger.debug('end lambda_handler()')
return result
- 環境変数設定
動作確認
感想
- Firehose経由と異なり、連続で画像を流してもまとめてアップロードされなかった
- アップロード時のファイル名は環境変数で指定した固定値なので
動的に設定できるようにしたい