別に画像じゃなくてもよいが。普通はアクセスできないS3のバケットに、一時的にPUT可能な署名付きURLを作成する。で、作成したURLにテストとしてcurlコマンドで画像をアップロードする手順のメモ。
curlのところでいつも忘れる。
環境
クライアント: Mac, High Sierra
S3バケットの用意
バケット名はtestdayo-sample-uploadとする。
で、アクセス権限のCORSの設定を以下のように。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
外からPUTできるように。
コード
Lambda関数のコードは以下。
import boto3
import json
def respond(err, res=None):
return {
'statusCode': '400' if err else '200',
'body': err if err else json.dumps(res),
'headers': {
'Access-Control-Allow-Origin' : '*',
'Content-Type': 'application/json',
},
}
def lambda_handler(event, context):
bucket_name = 'testdayo-sample-upload'
key = 'sample.jpeg'
s3 = boto3.client('s3', region_name = 'ap-northeast-1')
signed_url = s3.generate_presigned_url(
ClientMethod = 'put_object',
Params = {
'Bucket': bucket_name,
'Key': key,
'ContentType': 'image/jpeg'
},
ExpiresIn = 3600,
HttpMethod = 'PUT',
)
url = f"https://s3-ap-northeast-1.amazonaws.com/{bucket_name}/{key}"
res = {
"url": url,
"signed_url": signed_url
}
print(res)
return respond(None, res)
if __name__ == '__main__':
event = {}
context = {}
lambda_handler(event, context)
respond()は返り値用。サンプルにあるやつをそのまま。こいつを実行して署名付きURL(signed_url)が返ってくればOK。
実際にLambda関数として使う時は、S3の任意のバケットにアクセスできるポリシーを適用したロールをかぶせること。
画像のアップロード
test.jpegがあるとして。これを、出力された署名付きURLにcurlでアップロードする。
curl -H "Content-Type: image/jpeg" --upload-file test.jpeg "https://testdayo-sample-upload.s3.amazonaws.com/sample.jpeg?以降もろもろのやつコピペ"
-Hでs3.generate_presigned_url()で指定したコンテンツタイプと合わせるのいつも忘れる。
関連記事
aws の記事
- [2019年4月16日] S3 + CloudFrontでS3にファイルをアップロードしたら自動でキャッシュをクリアする
- [2019年3月27日] DynamoDBにboto3でトランザクションな書き込み
- [2019年1月22日] AWSのAPI Gateway + LambdaによるWeb APIでクエリ文字列を用いるcloudformation用テンプレートファイルの記述(swagger形式)
- [2019年1月14日] AWS SQSについて学ぶ
- [2019年1月12日] AWS CLIでよく使っているコマンド
- ---本記事---
- [2018年8月22日] クラウドの利用について思う
- [2018年8月21日] boto3でS3にアップロードした画像が、ブラウザで表示するとダウンロードされてしまう時
- [2018年8月10日] DynamoDBを使い始めて気をつけていること。DynamoDBをLambdaで使いたい
- [2018年8月8日] S3にGETやらPUTやらしたい時の設定
- [2018年8月3日] AWSのLambdaでcronみたいな感じで定期実行する
スポンサーリンク