三歩あるけば物も忘れる

お腹のお肉がメタボックル

ユーザ用ツール

サイト用ツール


Aws:Lambda:IssuedSignedUrlForUploadingS3Files

S3ファイルアップロード用署名付きURL発行

はじめに

LambdaでS3のファイルアップロード用の署名付きURLを発行する。
下記のサイトを参考に、自分用にメモ
https://dev.classmethod.jp/articles/create-pre-signed-url-with-lambda/

事前準備

① ファイルアップロード用のS3バケットを作成する。

以降、“s3-upload”バケットを作成した前提で記載します。
作成したS3バケットの、アクセス権限→CORS の設定に以下の記載をコピペして保存します。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

② ロールを作成し、以下のポリシーをアタッチする。

以降、“arn:aws:iam::000000000000:role/s3-upload”ロールを作成した前提で記載します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "*"
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "*"
        }
    ]
}

③ Lambda関数の作成

 
import boto3
from boto3.session import Session
from botocore.client import Config
import uuid
import os
 
REGION_NAME = 'ap-northeast-1'                 #事前準備①で作成したS3バケットのリージョン
S3_BUCKET_NAME = 's3-upload'                   #事前準備①で作成したS3バケット名
IAM_ROLE_ARN = 'arn:aws:iam::000000000000:role/s3-upload'  #事前準備②で作成したロールARN
DURATION_SECONDS = 900                      #署名付きURLの有効期間(秒)
 
def lambda_handler(event, context):
    print('Event: {}'.format(event))
     
    FILE_NAME = str(uuid.uuid4())               #S3バケットにアップロードされるファイル名、ここではUUIDを生成している
 
    print(FILE_NAME)
     
    client = boto3.client('sts')
 
    # AssumeRoleで一時的なCredential情報を発行
    response = client.assume_role(RoleArn=IAM_ROLE_ARN,
                                  RoleSessionName=FILE_NAME,
                                  DurationSeconds=DURATION_SECONDS)
 
    print(response)
     
    session = Session(aws_access_key_id=response['Credentials']['AccessKeyId'],
                      aws_secret_access_key=response['Credentials']['SecretAccessKey'],
                      aws_session_token=response['Credentials']['SessionToken'],
                      region_name=REGION_NAME)
 
    s3 = session.client('s3', config=Config(signature_version='s3v4'))
     
    url = s3.generate_presigned_url(ClientMethod = 'put_object', 
                                    Params = {'Bucket' : S3_BUCKET_NAME, 'Key' : FILE_NAME}, 
                                    ExpiresIn = DURATION_SECONDS, 
                                    HttpMethod = 'PUT')
 
    print(url)
 
    return {
       'statusCode': 200,
       'statusDescription': '200 OK',
       'isBase64Encoded': False,
       'headers': {
           'Content-Type': 'text/html; charset=utf-8'
        },
        'body': '{}'.format({'UrlPath':url})              #署名付きURLを出力
    }

実行例

署名付きURL発行

'UrlPath': 'https://s3-upload.s3.amazonaws.com/~~~~~'のURL部分が署名付きURLになる。

事前準備③で作成したLambda関数をAWSコンソールから実行する。

省略

事前準備③で作成したLambda関数をAPIGatewayから実行する。

ファイルアップロード

署名付きURLにcurlコマンドを実行する

curl -X PUT --upload-file [ファイルパス] "https://s3-upload.s3.amazonaws.com/~~~~~"

Aws/Lambda/IssuedSignedUrlForUploadingS3Files.txt · 最終更新: 2020/05/19 by 127.0.0.1