0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS/DVA学習】S3 Presigned URL(事前署名付き URL)× Lambda で実現するセキュアなダイレクトファイルアップロード

0
Posted at

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 バケットの作成

  1. Amazon S3 コンソールを開き、「バケットを作成」 をクリック。
  2. バケット名: dva-presigned-test-bucket
  3. デフォルト設定(パブリックアクセスブロック有効)のままバケットを作成します。

S3バケット作成画面

Step 2: Lambda 関数の実装(Presigned URL 生成コード)

  1. Lambda 関数の実行ロールに S3 へのアクセス権限(AmazonS3FullAccess または s3:PutObject 許可ポリシー)を追加アタッチします。
  2. 以下の 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)を取得します。

Lambda実行結果

cURL コマンドによる S3 への直接 PUT アップロード

取得した Presigned URL に対して、CloudShell から curl コマンドでデータを送信(PUT)します。

cURL実行とS3確認

S3 バケットの確認

S3 コンソールで dva-presigned-test-bucket を確認すると、test-upload-file.txt が正常にアップロードされ、ファイル内容(Hello, Presigned URL World!)が反映されていることが確認できました!

S3バケット内のオブジェクト確認

ポイント

① generate_presigned_url メソッドと引数

  • SDK (Boto3) で事前署名付き URL を生成する際は generate_presigned_url を使用する。
  • ClientMethod: アップロードの場合は 'put_object'、ダウンロードの場合は 'get_object' を指定。
  • ExpiresIn: URL の有効期限(秒数)を指定する。

② S3 バケットのセキュリティとアクセス制御

  • バケット自体はパブリック非公開のままであっても、Presigned URL を発行した IAM ロールの権限の範囲内で一時的なアクセスが可能となる。
  • クライアントからアップロードする際は、URL 生成時に指定した ContentType などのヘッダーを一致させる必要がある。
0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?