ちょっとしたデバッグのため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 の権限も必要