0
1

【AWS】Lambdaで署名付きURLを作成する実装例【署名付きURL】

Last updated at Posted at 2024-01-07

はじめに

以前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アドレスからのアクセスのみを許可するといった柔軟なアクセス制御が可能です。

アーキテクチャ図

署名付きURL.png

構築手順

1.Lambda関数の実装

①Lambda関数を作成する

  • 前回の記事では固定のレスポンスを返すだけでしたが、今回のコード例ではLambda内で署名URLを発行してレスポンスとして返します。
  • 以下の例ではWebAppから「ファイル名」をAPIGatewayのパラメータ経由で取得し、Lambda関数で署名付きURLを発行した後、それをレスポンスとして返しています。
  • S3のバケット名とフォルダ名は環境変数に設定してそれを取得するようにしています。
  • generate_presigned_url メソッドを呼び出すことで署名付きURLを発行しています。

<コード例>

sample.py
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に基づいて選択されます。
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1