~~NOCACHE~~ ## S3ファイルアップロード用署名付きURL発行 ### はじめに LambdaでS3のファイルアップロード用の署名付きURLを発行する。 下記のサイトを参考に、自分用にメモ https://dev.classmethod.jp/articles/create-pre-signed-url-with-lambda/ ### 事前準備 #### ① ファイルアップロード用のS3バケットを作成する。 以降、"s3-upload"バケットを作成した前提で記載します。 作成したS3バケットの、アクセス権限→CORS の設定に以下の記載をコピペして保存します。 * PUT POST 3000 * #### ② ロールを作成し、以下のポリシーをアタッチする。 以降、"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から実行する。 [[Aws:APIGateway:CallingLambdafunction|APIGatewayのGETメソッドで取得]] #### ファイルアップロード 署名付きURLにcurlコマンドを実行する curl -X PUT --upload-file [ファイルパス] "https://s3-upload.s3.amazonaws.com/~~~~~" {{tag>AWS Lambda 実践的}}