~~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 実践的}}