S3に有効期限のあるURLを作って画像ファイルをPUTする

別に画像じゃなくてもよいが。普通はアクセスできない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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です