片岡空の上の空

一旦書き留めるためのページ

S3の署名バージョンをアップデートさせる

Amazon S3 における AWS 署名バージョン 2 の廃止」

 

先日このような記事が出て、このままでは古い環境でS3へのアクセスができなくなる可能性があるため、回収を行いました。

 

詳しくはこちらを御覧ください

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingAWSSDK.html#UsingAWSSDK-sig2-deprecation https://dev.classmethod.jp/cloud/aws/s3-sigv2-abolition/

【超重要】対応しないと使えなくなるかも?!今、全S3ユーザがチェックすべき署名バージョン2の廃止について | DevelopersIO

 

環境はrailsでまさかの ruby-version 2.2.1

 

まずはrubyのアップデートをしろよ!!というツッコミも多いかと思いますが、

 

今回はS3の部分のみアップデートしていきます。

 

元のGEMバージョンはそれぞれ

Gemfile

gem 'aws-sdk', '< 2.0'

gem 'paperclip', '~> 4.2'

 

Gemfile.lock

aws-sdk (1.65.0)

  aws-sdk-v1 (= 1.65.0)

aws-sdk-v1 (1.65.0)

  json (~> 1.4)

  nokogiri (>= 1.4.4)

paperclip (4.3.0)

  activemodel (>= 3.2.0)

  activesupport (>= 3.2.0)

 

今までこのようにしていた指定をこのように変更致しました。

Gemfile

gem 'aws-sdk', '~> 3'

gem 'paperclip', '~> 6'

 

Gemfile.lock

aws-eventstream (1.0.2)

aws-partitions (1.144.0)

aws-sdk (3.0.1)

・・・・

paperclip (6.1.0)

  activemodel (>= 4.2.0)

  activesupport (>= 4.2.0)

 

rails部分の変更は下記のようになりました。

【アップロード】

変更前

AWS.config(

  access_key_id: [access_key_id],

  secret_access_key: [secret_access_key],

  region: 'ap-northeast-1' )

s3 = AWS::S3.new

upload_file_name = "hoge"

file = s3.bucketsbucket.objects[upload_file_name]

s3_object = file.write(file: params['hoge_img'].tempfile)

 

変更後

 ::Aws.config = {

  access_key_id: [access_key_id],

  secret_access_key: [secret_access_key],

}

s3 = ::Aws::S3::Client.new(:region => 'ap-northeast-1')

upload_file_name = "hoge"

s3.put_object(

  :bucket => [bucket],

  :key => upload_file_name,

  :body => params['estimate_pdf'].tempfile

)

 

【ダウンロード】

変更前

AWS.config(

  access_key_id: [access_key_id],

  secret_access_key: [secret_access_key],

  region: 'ap-northeast-1'

)

s3 = AWS::S3.new

file_name = 'hoge'

file = s3.bucketsbucket.objects[file_name]

send_data file.read, filename: params[:file_name], disposition: 'attachment', stream: 'true', buffer_size: '4096'

 

変更後

::Aws.config = {

  access_key_id: [access_key_id],

  secret_access_key: [secret_access_key],

}

s3 = ::Aws::S3::Client.new(:region => 'ap-northeast-1')

file_name = 'hoge'

object = s3.get_object({ :bucket => [bucket], :key => file_name, })

send_data object.body.read, filename: params[:file_name], disposition: 'attachment', stream: 'true', buffer_size: '4096'

 

もっとよい書き方があったら、教えていただきたいです。