はじめに
はじめまして、ずっと大地と申します。
2023年11月より、オンラインスクールのRUNTEQにて、未経験からのWebエンジニア転職を目指して学習をしています。
初学者のうえ、記事を書くのは初めてです。
記述漏れや作成ファイルの記載忘れなど、不備があるかもしれないので、間違いなどあれば教えて頂けたらと幸いです。
また、人によって環境の違いがあるかと思うので、あくまでも私自身の環境で、記事投稿時の記録ということをお許しください。
概要
アプリ開発にて実装した、Amazon S3
での本番環境の画像アップロードについて、設定が多く難しいと感じたので、記事にしたいと思います。
CarrierWave
を導入済み、AWS
にrootユーザー
、IAMユーザー
としてログインできる状態を前提とします。
環境
Ruby 3.2.3
Rails 7.1.3.2
CarrierWave
Amazon S3
Render.com
手順
rootユーザーとしてサインイン
まずは、rootユーザー
としてサインインします。
右上からリージョンをアジアパシフィック(東京)
にしておきます。
S3を検索
上部の検索欄からS3
を検索し、S3
を選びます。
バケット作成
バケット作成
のボタンを押します。
AWSリージョンは、アジアパシフィック (東京) ap-northeast-1
で設定、バケット名
を決め、汎用
を選びます。
※バケットは、簡単に言うと画像を保存する場所です。
ACLを有効
にします。
下から3つの項目にチェックを入れ、他は特に変えずにスクロールしてページ下部のバケット作成
ボタンを押します。
バケットポリシーの設定
作成されたバケットを選択、上部に並んでいるアクセス許可
から、バケットポリシー
欄の編集
を押します。
バケットポリシーを編集します。
①、②、③を編集します。
編集ができたら、変更を保存
を押します。
※日本語など入っていると保存できません。
{
"Version": "2012-10-17",
"Id": "Policy1544152951996",
"Statement": [
{
"Sid": "Stmt1544152948221",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::①IAMユーザー時に必要な12桁の数字:user/②IAMユーザー名"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::③バケット名"
}
]
}
アクセスキーの取得
IAMユーザー
としてログインします。
上部の検索欄からIAM
と検索し、ダッシュボードにいきます。
左側のバーからユーザー
を押し、オレンジ色のユーザーの作成
を押します。
ユーザー名を決めて、次へ
を押します。
ポリシーを直接アタッチする
を選んで、AmazonS3FullAccess
にチェックを入れます。s3
と検索するとすぐ見つかります。
アクセスキーの発行
※ここはキーの発行なので画像を載せていません。
使いたいユーザーを選び、セキュリティ認証情報
から、アクセスキーを作成
を押します。
外部から...
を選んで、完了
を押すと、アクセスキーが発行されます。
後で.env
ファイルに記述するので、控えておいてください。
キーは後で表示されませんので、ご注意ください。
各設定ファイルの編集
Gemfile
に下記を追記し、bundle install
します。
gem "aws-sdk-s3"
config/environments/production.rb
の記述を、下記のようにlocal
からamazon
に変更します。
#config.active_storage.service = :local
config.active_storage.service = :amazon
config/storage.yml
を以下のようにします。
環境変数になっている部分は後述します。
作成したバケット名を記述してください。
amazon:
service: S3
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
region: ap-northeast-1
bucket: バケット名
再びGemfile
に追記し、bundle install
します。
gem 'fog-aws'
carrierwave
が導入してあれば、app/uploders/avatar_uploder.rb
のようなファイルがあると思うので、以下のようにします。
class AvatarUploader < CarrierWave::Uploader::Base
# 略
if Rails.env.production?
storage :fog # 本番環境ではfogを使用
else
storage :file # 開発環境とテスト環境ではfileを使用
end
# 略
end
config/initializers/carrierwave.rb
を作成し、以下のようにします。
コピペで問題ありませんが、①バケット名は自分のものを記述してください。
環境変数になっている部分は、config/storage.yml
と同じ記述です。
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'
CarrierWave.configure do |config|
config.storage :fog
config.fog_provider = 'fog/aws'
config.fog_directory = '①バケット名'
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
region: 'ap-northeast-1',
path_style: true
}
end
.env
に以下のように追記をします。
ファイルを作ったことがない方は作成してください。
ここでキーを打つことで、config/storage.yml
と、config/initializers/carrierwave.rb
の環境変数が使われ、GitHubに大事な情報が上がらなくなります。
AWS_ACCESS_KEY_ID=アクセスキーを記述
AWS_SECRET_ACCESS_KEY=シークレットキーを記述
デプロイ
デプロイ先の設定にもキーを追加します。
私の場合は、Render.comなので、以下のように記載します。
デプロイします。
本番環境で画像をアップロードする実装を試します。
rootユーザー
としてログインし、バケット
のオブジェクト
に画像が保存されていたら実装完了です。
お疲れ様でした!!
おわりに
AWSと聞くだけで少し身構えますが、実装ができて良かったです。
実装にあたって参考にさせていただいた記事や、詰まった時に助けていただいた記事は下に載せておきます。
ここまで読んでくださり、ありがとうございました。
参考記事・引用元