AWS Certified Developer – Associate(DVA-C02)の試験対策および実践学習として、S3 Presigned URL(事前署名付き URL) と AWS Lambda (Python/Boto3) を組み合わせたセキュアなファイルアップロード構成を構築・検証しました。
クライアント側に AWS 認証情報(IAM アクセスキー)を持たせることなく、一時的な権限を付与して S3 へファイルを直接アップロードさせる設計パターンをまとめています。
アーキテクチャと全体像
[ クライアント (CloudShell / cURL) ]
│
├─① URL 生成要求 ──► [ AWS Lambda ]
│ │
│ ◄─② Presigned URL 返却 ──┘ (generate_presigned_url)
│
└─③ S3 へ直接 PUT アップロード ───────────► [ Amazon S3 バケット ]
(test-upload-file.txt)
セキュリティ向上
- クライアントアプリ(Webブラウザやスマホアプリ)に IAM 認証情報を持たせる必要がない。
Lambda の制約回避
- 大容量ファイルを Lambda 経由で転送すると発生する 「ペイロードサイズ制限 (6MB)」 や 「実行時間制限 (15分)」 を回避し、S3 へ直接高速にアップロードできる。
アクセス制御
-
ExpiresInパラメータにより、数分間だけ有効な一時的アクセス権限を発行できる。
構築手順
テスト用 S3 バケットの作成
- Amazon S3 コンソールを開き、「バケットを作成」 をクリック。
-
バケット名:
dva-presigned-test-bucket - デフォルト設定(パブリックアクセスブロック有効)のままバケットを作成します。
Step 2: Lambda 関数の実装(Presigned URL 生成コード)
- Lambda 関数の実行ロールに S3 へのアクセス権限(
AmazonS3FullAccessまたはs3:PutObject許可ポリシー)を追加アタッチします。 - 以下の Python コードをデプロイします。
import os
import boto3
from botocore.config import Config
# S3 クライアントの初期化(V4 署名を明示指定)
s3_client = boto3.client('s3', config=Config(signature_version='s3v4'))
# 作成した S3 バケット名
BUCKET_NAME = 'dva-presigned-test-bucket'
def lambda_handler(event, context):
object_name = 'test-upload-file.txt' # アップロード対象のオブジェクト名
presigned_url = s3_client.generate_presigned_url(
ClientMethod='put_object',
Params={
'Bucket': BUCKET_NAME,
'Key': object_name,
'ContentType': 'text/plain'
},
ExpiresIn=300 # 300秒 (5分間) だけ有効
)
return {
'statusCode': 200,
'uploadUrl': presigned_url
}
動作検証と結果
Lambda で Presigned URL の発行
Lambda コンソールで 「Test」 を実行し、署名付き URL(uploadUrl)を取得します。
cURL コマンドによる S3 への直接 PUT アップロード
取得した Presigned URL に対して、CloudShell から curl コマンドでデータを送信(PUT)します。
S3 バケットの確認
S3 コンソールで dva-presigned-test-bucket を確認すると、test-upload-file.txt が正常にアップロードされ、ファイル内容(Hello, Presigned URL World!)が反映されていることが確認できました!
ポイント
① generate_presigned_url メソッドと引数
- SDK (Boto3) で事前署名付き URL を生成する際は
generate_presigned_urlを使用する。 -
ClientMethod: アップロードの場合は'put_object'、ダウンロードの場合は'get_object'を指定。 -
ExpiresIn: URL の有効期限(秒数)を指定する。
② S3 バケットのセキュリティとアクセス制御
- バケット自体はパブリック非公開のままであっても、Presigned URL を発行した IAM ロールの権限の範囲内で一時的なアクセスが可能となる。
- クライアントからアップロードする際は、URL 生成時に指定した
ContentTypeなどのヘッダーを一致させる必要がある。



