はじめに
S3 で署名付き URL を生成して、アップロードを行う際に、Windows からアップロードできるか不明でした。
この記事では、S3 署名付き URL を使って、WIndows からアップロードを行う検証記事です。
留意点
この記事では、curl コマンドを利用する前提で記載しています。
Windows のコマンドプロンプト上で curl コマンドが標準で搭載されたのは Windows 10 からです。古い WIndows 7 では追加のインストールをすれば curl が利用できるようです。ただ、そもそもサポートも切れているので利用できないことも考えられます。古めの OS の場合は気を付けましょう。
Python でアップロード用の署名付き URL を生成する
まず、S3 のアップロード用の署名付き URL を生成します。いろいろ方法はあるのですが、今回は Python のプログラムから生成します。
import boto3
s3_client = boto3.client('s3', region_name='ap-northeast-1')
url = s3_client.generate_presigned_url(
ClientMethod='put_object',
Params={'Bucket': 's3-presigned-test01', 'Key': 'this-is-filename.txt'},
ExpiresIn=3600)
url = url.replace('s3.amazonaws.com', 's3.ap-northeast-1.amazonaws.com')
url = url.replace('&', '^&')
print(url)
重要なところをピックアップします。以下の部分は、アップロードの対象の S3 バケットの名前や、ファイル名を指定するものです。ファイル名は、アップロード元のファイル名は関係なしに、ここで指定した this-is-filename.txt
にリネームされます。
Params={'Bucket': 's3-presigned-test01', 'Key': 'this-is-filename.txt'},
一点注意点があり、Windows のコマンドプロンプトを利用する際には「& (アンパサンド)」は特別な意味を持つ特殊記号です。2 つ以上のコマンドを連結する際に利用されるものとなっています。S3 の署名付き URL には「&」が含まれているので、Windows 用にエスケープを行っています。
次のコードの部分で、エスケープを行っています。コマンドプロンプト以外の環境では不要なので削除してください。
url = url.replace('&', '^&')
実行例はこんな感じです。
$ python3 s3-create-presign-upload.py
https://s3-presigned-test01.s3.ap-northeast-1.amazonaws.com/this-is-filename.txt?AWSAccessKeyId=yoursecret^&Signature=80lSBFAm7BvYoyP%2FT7kRbWlfUn0%3D^&Expires=1706693998
コマンドプロンプトからアップロード
さきほど生成した署名つき URL を使って、コマンドプロンプトからアップロードを行っていきます。コマンドプロンプトを立ち上げます。
アップロードしたいファイルが格納されているディレクトリに移動します。
C:\Users>cd C:\sizai
C:\sizai>dir
ドライブ C のボリューム ラベルは OSDisk です
ボリューム シリアル番号は F68D-03E3 です
C:\sizai のディレクトリ
2024/01/31 15:47 <DIR> .
2024/01/31 15:47 <DIR> ..
2024/01/31 15:43 7 hello-s3-from-windows.txt
1 個のファイル 7 バイト
2 個のディレクトリ 46,067,441,664 バイトの空き領域
C:\sizai>
curl コマンドを使ってアップロードを行います。
curl -X PUT ^
--upload-file hello-s3-from-windows.txt ^
"https://s3-presigned-test01.s3.ap-northeast-1.amazonaws.com/this-is-filename.txt?AWSAccessKeyId=yoursecret^&Signature=80lSBFAm7BvYoyP%2FT7kRbWlfUn0%3D^&Expires=1706693998"
次のように、S3 バケットにファイルがアップロードされている様子を確認できました。
検証を通じてわかったこと
- Windows に curl コマンドが標準搭載されているのは Windows 10 以降
- curl コマンドで指定する URL に「&(アンパサンド)」が含まれており、エスケープに気を付ける必要がある。