[小ネタ]S3の署名付きURLを利用して、非AWSユーザにWindows PCからファイルをアップロードしてもらった話

西澤です。メール添付ファイルサイズの制限にかかり、ファイルの受け渡しができない問題というあるあるに遭遇しました。非AWSユーザにWindows PCからS3の署名付きURLを利用してファイルをアップロードしてもらうよう案内する機会があったので、手順をまとめておきます。

前提

今回は、以下のような状況でした。

  • ファイルの送り手側
    • 非AWSユーザ
    • 端末はWindows
    • 案内すればコマンドライン操作が行えるエンジニア
  • ファイルの受け手側
    • 管理者権限を有するAWSアカウントを持っている

S3の署名付きURL

S3の署名付きURLについては、古くからある機能ですので、目新しさはありません。どのようなものか、ご存知無い方はぜひ下記記事もお読みください。期限付きのアクセス権を有したURLを発行できる非常に便利なS3の標準機能です。

【小ネタ】AWS CLIでS3のPre-Signed URLを生成できるようになっていました!

事前準備

まず、アップロードしてもらう為のS3バケットを用意しておきます。今回は署名付きURLを利用するので、バケットポリシー等からS3に対してのアクセス許可設定は不要です。アップロードしてもらうオブジェクトのパス(キー)は事前に存在しないものを適当に決めておきます。

  • S3バケット名=cm-nishizawa-upload
  • オブジェクトキー=upload.zip

そして、こちらのキーに対するアップロード用の署名付きURLを発行します。AWS CLIのpresignオプションでは、ダウンロード(GET)用の署名付きURLしか発行できないので、下記記事を参考にboto3を使ってアップロード(PUT)用のURLを作成しました。

Boto3でS3のpre-signed URLを生成する

import boto3

BUCKET = 'cm-nishizawa-upload'
KEY = 'upload.zip'

s3 = boto3.client('s3')
print s3.generate_presigned_url(
  ClientMethod = 'put_object',
  Params = {'Bucket' : BUCKET, 'Key' : KEY},
  ExpiresIn = 3600,
  HttpMethod = 'PUT')

この署名付きURLを発行するCredentialに、対象S3バケットへの書き込み権限が必要となります。また、ここでTemporary Credentialを使ってしまうと、想定よりも短い期間でExpireしてしまうことがありますので、ご注意ください。

非AWSユーザにアップロードを依頼

あとは、非AWSユーザにアップロードを依頼するのですが、今回はコマンドライン操作も可能なエンジニアの方だったので、アップロード対象のファイルを配置したフォルダからPowershellで操作していただくコマンドを案内することで、ファイルをアップロードしてもらうことに成功しました。

$file = "test.zip" #アップロードするファイル名
$uri = "(発行した署名付きURL)"
Invoke-WebRequest -uri $uri -Method Put -Infile $file -UseBasicParsing

AWS Management Console等からS3にアップロードされたファイルをダウンロードすれば、無事に目的だったファイルの受け渡しも完了です。めでたしめでたし。

まとめ

このような簡単なしかけをAWSの標準機能だけで簡単に用意できるのはありがたいですね。でも、個人的にはコードはなるべく書かずに済ませたいというエンジニアらしからぬマインドが強いので、AWSをマネージメントコンソールからしか触ることが無い方でもせっかくのこのような便利な機能を簡単に利用できるようなUIがあると嬉しい人もいるのかなと改めて思ってしまったりもしました。

誰かのお役に立てば嬉しいです。