LambdaでS3にある画像をDropboxにアップロードしたときの個人メモ
構成図
前提
LambdaでDropbox APIを実行するができていること
実行準備
S3
Lambda
作成
lambda_function.py
import boto3
import base64
import requests
import json
ACCESS_TOKEN = '(取得したアクセストークン)'
#ルートフォルダ配下の配置場所
FOLDER_PATH = "/image/"
#ファイル名
FILE_NAME = 'escle.png'
ARG_TMP = '{"path": "' + FOLDER_PATH + FILE_NAME + '","mode": "add","autorename": true,"mute": false,"strict_conflict": false}'
ARG = ARG_TMP.encode("utf_8")
# S3から指定したバケット、フォルダ、ファイル名の画像を取得する
# 取得できる画像サイズはLambdaのメモリーに依存
# return:画像のバイナリデータ
def get_img_from_s3():
s3 = boto3.client('s3')
bucket_name = '(バケット名)'
file_path = 'sample/' + FILE_NAME
response = s3.get_object(Bucket=bucket_name, Key=file_path)
body = response['Body'].read()
return body
# 画像をDropboxにアップロードする
# img:画像のバイナリデータ
# return:アップロード結果
def upload_to_dropbox(img):
headers = {
'Authorization': 'Bearer ' + ACCESS_TOKEN,
'Dropbox-API-Arg': ARG,
'Content-Type': 'application/octet-stream',
}
response = requests.post('https://content.dropboxapi.com/2/files/upload', headers=headers, data=img)
return json.dumps(response,default=str)
def lambda_handler(event, context):
img = get_img_from_s3()
result = upload_to_dropbox(img)
return result
S3を読み込むための権限を付与
HTTPリクエストのためにレイヤーの追加
- CloudShellにて以下を実行
【Lambda】import requests が使えるようにする【python】
Dropbox
-
uploadのリファレンスを確認し、「files.content.write」が必要なことを確認
- アプリに権限を追加 ※LambdaでDropbox APIを実行するで利用したアプリを利用
実行手順
感想
- レイヤーの追加が面倒だったが、それ以外は簡単だった
- 現状だとファイル名は固定なので動的設定できるようにしたい