LoginSignup
2
1

Windows で S3 署名付き URL に、curl をつかってファイルをアップロードする

Posted at

はじめに

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 を使って、コマンドプロンプトからアップロードを行っていきます。コマンドプロンプトを立ち上げます。

image-20240131154605586.png

アップロードしたいファイルが格納されているディレクトリに移動します。

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 バケットにファイルがアップロードされている様子を確認できました。

image-20240131175622115.png

検証を通じてわかったこと

  • Windows に curl コマンドが標準搭載されているのは Windows 10 以降
  • curl コマンドで指定する URL に「&(アンパサンド)」が含まれており、エスケープに気を付ける必要がある。
2
1
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
2
1