[小ネタ] CloudShell で S3 の署名付き URLを作成、ファイルをアップロードしてみた

AWS SDK を使用しますが、サンプルコードが公開されているので手軽に S3 の署名付き URL でアップロードできました
2023.08.08

アノテーション・テクニカルサポートチームの hato です。
ダウンロード用の S3 署名付き URLは、AWS マネジメントコンソールから手軽に生成できることもあり、触ったことがありますが、アップロード用の S3 署名付き URL は触ったことがなかったので、やってみました。

やってみた

前提

  • アップロード先の S3 バケットは作成済み

AWS SDK を使用する

アップロード用の S3 署名付き URL を作成する方法は大きく二つあります。

  • AWS Explorer for Visual Studio
  • AWS SDK

今回は CloudShell で AWS SDK を利用して行います。 なお、署名付き URLの作成とアップロードはサンプルコードが AWS より各プログラミング言語毎に公開されているので、そちらを使用します。

Create a presigned URL for Amazon S3 using an AWS SDK - Amazon Simple Storage Service

CloudShell を開いて、SDK for Python (Boto3)用のサンプルコードをダウンロードします。

$ wget "https://raw.githubusercontent.com/awsdocs/aws-doc-sdk-examples/main/python/example_code/s3/s3_basics/presigned_url.py"

アップロード先の S3 バケット名と、アップロードするファイルを指定して、コマンドを実行します。

$ python3 presigned_url.py 【バケット名】 【オブジェクト名】 put

# 実行例
$ python3 presigned_url.py <バケット名> upload_file.txt put
----------------------------------------------------------------------------------------
Welcome to the Amazon S3 presigned URL demo.
----------------------------------------------------------------------------------------
INFO: Got presigned URL: https://<バケット名>.s3.amazonaws.com/upload_file.txt
Using the Requests package to send a request to the URL.
Putting data to the URL.
Got response:
Status: 200

----------------------------------------------------------------------------------------

指定した S3 バケットにファイルがアップロードされていることを確認します。

署名URL だけ発行して、ファイルは別にアップロードしたい

コマンドで指定したファイルがない場合、その旨のエラーが表示されますが、署名URL は発行されます。

$ python3 presigned_url.py <バケット名> upload_file.txt put
----------------------------------------------------------------------------------------
Welcome to the Amazon S3 presigned URL demo.
----------------------------------------------------------------------------------------
INFO: Got presigned URL: https://<バケット名>.s3.amazonaws.com/upload_file.txt
Using the Requests package to send a request to the URL.
Putting data to the URL.
Couldn't find upload_file.txt. For a PUT operation, the key must be the name of a file that exists on your computer.
----------------------------------------------------------------------------------------

そのため、上記発行された URL を使って、ローカルから curl 等でアップロードもできます。

$ curl -X PUT \
--upload-file 【アップロードするファイル】 \
【署名付き URL】

# コマンド例
$ curl -X PUT \
--upload-file upload_file.txt \
'https://<バケット名>.s3.amazonaws.com/upload_file.txt'

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。