0
3

More than 5 years have passed since last update.

s3 へPOSTでファイルをアップロードする(署名バージョン2)

Last updated at Posted at 2016-04-06

ちょっとしたデバッグのためs3へファイルをアップロードするスクリプトを書いた

使用するには

  • 環境変数 AWS_SECRET_ACCESS_KEY にシークレットアクセスキー
  • 環境変数 AWS_ACCESS_KEY_ID にアクセスキーID
  • s3_bucket に対象のバケット名
  • target_file にアップロード対象のファイル名

をそれぞれ設定する必要あり

実行方法は ruby s3upload_signature_v2.rb のように実行。

コード

s3upload_signature_v2.rb
#
# POST with signature v2
#
require "base64"
require "openssl"
require "digest/sha1"

aws_secret_key = ENV["AWS_SECRET_ACCESS_KEY"]
aws_access_key_id = ENV["AWS_ACCESS_KEY_ID"]
s3_bucket = "mybucket"
target_file = "test.txt"

policy_document = <<EOS
{"expiration": "2016-12-31T00:00:00Z",
  "conditions": [
    {"bucket": "#{s3_bucket}"},
    {"acl": "private"},
    ["starts-with", "$key", ""],
    {"x-amz-server-side-encryption": "AES256"}
  ]
}
EOS

policy = Base64.encode64(policy_document).delete("\n")

signature = Base64.encode64(
  OpenSSL::HMAC.digest(
    OpenSSL::Digest::SHA1.new,
    aws_secret_key,
    policy
  )
).delete("\n")

cmd = <<__CURL_COMMAND__
curl -v -X POST \\
     -F x-amz-server-side-encryption="AES256" \\
     -F key=#{target_file} \\
     -F AWSAccessKeyId="#{aws_access_key_id}" \\
     -F acl="private" \\
     -F policy="#{policy}" \\
     -F signature="#{signature}" \\
     -F "file=@#{target_file}" \\
     https://#{s3_bucket}.s3.amazonaws.com/
__CURL_COMMAND__
puts cmd
puts `#{cmd}`

補足

上記コードを動作するためには以下も必要

  • IAMユーザのポリシーで s3:PutObject の権限が付与されている必要あり
  • acl を "private" 以外("public-read"など)に設定する場合は s3:PutObjectAcl の権限も必要

参考

0
3
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
0
3