サンプルコードを使用し、S3バケットに保管してあるファイルをS3 presigned URLでダウンロードする方法についてご紹介します。
次のものが動作する環境が必要です。
- AWS CLI
- AWS SAM CLI
- Docker Desktop
- WSL2(Windowsの場合)
-
ソースコードを取得します。
git clone https://github.com/cm-fujikawa/s3-download-file.git
-
バケット名をユニークにするため、パラメータストアを作成し、任意の文字列を格納しておきます。
aws ssm put-parameter --name S3DownloadFileSuffix --value `date "+%Y%m%d%H%M%S"` --type String --profile HOGEHOGE
-
ビルドして、AWSにデプロイします。ローカルにPython環境を構築しなくても済むように、ここでは、ローカルのコンテナ環境でビルドしています。
cd s3-download-file sam build --use-container sam deploy --guided --stack-name s3-download-file --region ap-northeast-1 --profile HOGEHOGE
コードを2ヶ所書き換えます。
sam deploy
コマンドの実行結果の末尾に表示されるListPy
、ListHtml
の値を控えておきます。
-
AWSマネジメントコンソール
でCloudFormation
を開き、s3-download-file
スタックを開きます。 -
リソース
タブを開きます。 -
論理ID
がListFunction
という名称のLambda関数を開きます。 -
コードソース
でlist.py
ファイルをダブルクリックします。 -
XXXXXXXXXX
をListPy
の値に書き換えます。S3DownloadFileApi = 'XXXXXXXXXX'
-
Deploy
ボタンをクリックします。
- ローカルで
contents
フォルダにあるlist.html
ファイルを開きます。 XXXXXXXXXX
をListHtml
の値に書き換えます。
s3-list-files-bucket-XXXXXXXX
バケットを開きます。contents
フォルダの階層ごと(contents
フォルダとlist.html
ファイル)をコピーします。
s3-download-file-bucket-XXXXXXXX
バケットを開きます。- ダウンロードさせたいファイルをアップロードします。
-
sam deploy
コマンドの実行結果の末尾に表示されるAccessUrl
にアクセスします。 -
AccessUrl
は、次のようなURLです。${S3BucketName}
にはs3-list-files-bucket-XXXXXXXX
バケット名です。https://${S3BucketName}.s3-ap-northeast-1.amazonaws.com/contents/list.html
-
s3-download-file-bucket-XXXXXXXX
バケットにあるファイルが一覧表示されます。 -
適当なリンクをクリックします。
-
ファイルがダウンロードされます。
-
S3バケット内にあるすべてのファイルを削除します。
-
S3バケット名の末尾の文字列を確認します。
export S3DownloadFileSuffix=`aws ssm get-parameter --name S3DownloadFileSuffix --profile HOGEHOGE \ | jq -r '.Parameter.Value'` echo $S3DownloadFileSuffix
-
S3バケットを削除します。
aws s3 rb s3://s3-download-file-bucket-$S3DownloadFileSuffix --force --profile HOGEHOGE aws s3 rb s3://s3-list-files-bucket-$S3DownloadFileSuffix --force --profile HOGEHOGE
-
次のコマンドでスタックを削除します。
aws cloudformation delete-stack --stack-name s3-download-file --profile HOGEHOGE
HTML、API Gatewayには認証が掛かっていないため、ここで作成したS3バケットに誰でもアクセスできてしまいます。