はじめに
以前APIGatewayとLambdaの連携についての記事を投稿しましたが、この構成の使用例として、Lambda関数でのS3ファイルの署名付きURLを生成して返す実装について投稿します。
[APIGateWayとLambdaの連携についての記事]
https://qiita.com/Nana_777/items/0ce03f59045aa04401bc
署名付きURLを利用するメリット
一時的なアクセス制御
署名付きURLは有効期限を持ち、期限が切れるとアクセスが拒否されます。これにより、一時的にアクセスが必要な場合に、不要にアクセス権を与え続けることを避けることができます。
簡単なアクセス管理
署名付きURLを使用することで、AWS Identity and Access Management (IAM) ポリシーの設定が簡略化されます。特定のS3オブジェクトに対するアクセス許可を一時的に発行でき、必要がなくなれば署名付きURLを無効にできます。
安全なデータ転送
署名付きURLはHTTPSプロトコルを使用して生成され、データの転送が暗号化されます。これにより、データの安全な伝送が確保されます。
プリサインドURLの生成
プリサインドURLは、あらかじめ生成して署名を付けたURLです。これにより、ユーザーによる要求があった場合に即座に署名付きURLを提供することができます。
クエリパラメータでの制御
署名付きURLは、クエリストリングの一部として署名情報を含むため、アクセス時の要件をクエリパラメータで指定することができます。例えば、特定のIPアドレスからのアクセスのみを許可するといった柔軟なアクセス制御が可能です。
アーキテクチャ図
構築手順
1.Lambda関数の実装
①Lambda関数を作成する
- 前回の記事では固定のレスポンスを返すだけでしたが、今回のコード例ではLambda内で署名URLを発行してレスポンスとして返します。
- 以下の例ではWebAppから「ファイル名」をAPIGatewayのパラメータ経由で取得し、Lambda関数で署名付きURLを発行した後、それをレスポンスとして返しています。
- S3のバケット名とフォルダ名は環境変数に設定してそれを取得するようにしています。
- generate_presigned_url メソッドを呼び出すことで署名付きURLを発行しています。
<コード例>
import os
import boto3
import json
# Lambdaの環境変数からフォルダ名とバケット名を取得
folder_name = os.environ['FOLDER_NAME']
bucket_name = os.environ['BUCKET_NAME']
def lambda_handler(event, context):
# API Gatewayからのクエリストリングパラメータ取得
file_name = event['queryStringParameters']['fileName']
# 署名付きURLの有効期限(秒)
expiration_time = 60 * 60 # 1時間
# AWS SDKの設定
s3 = boto3.client('s3')
# フォルダ名とファイル名を組み合わせてオブジェクトキーを生成
object_key = f'{folder_name}/{file_name}'
try:
# 署名付きURLの生成
signed_url = s3.generate_presigned_url(
ClientMethod = 'get_object',
Params = {'Bucket' : bucket_name, 'Key' : object_key},
ExpiresIn = expiration_time,
HttpMethod = 'GET'
)
return {
'statusCode': 200,
'body': json.dumps({'signedUrl': signed_url})
}
except Exception as e:
print('Error generating signed URL:', e)
return {
'statusCode': 500,
'body': json.dumps({'error': 'Internal Server Error'})
}
2.API Gatewayの設定
※こちらは前回の記事を参照してください
https://qiita.com/Nana_777/items/0ce03f59045aa04401bc
署名URL生成(getSignedUrlPromise)メソッドのパラメータ説明
パラメータ | 説明 |
---|---|
ClientMethod | 文字列, 必須。署名付きURLを生成する対象のS3操作を指定します。例えば、'get_object'や'put_object'などがあります。 |
Params | 辞書, オプション。S3操作に必要なパラメータを指定します。この辞書には、バケット名 (Bucket)、オブジェクトキー (Key)、およびその他の必要なパラメータが含まれます。 |
ExpiresIn | 数値, オプション。署名付きURLの有効期限を秒単位で指定します。デフォルトは3600秒(1時間)です。有効期限が切れると、そのURLはアクセスできなくなります。 |
HttpMethod | 文字列, オプション。HTTPメソッドを指定します。例えば、'GET'や'PUT'などがあります。デフォルトはNoneで、メソッドはClientMethodに基づいて選択されます。 |