開発環境
Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系
本番環境
nginx 1.18.0
AWS(EC2, S3, ALB, Route53)
前提
- capistranoのによる自動デプロイを導入しています
- 無料枠の関係で、本番環境にのみS3を導入します
- AWSには登録済みとします
バケット作成
まずはAWSにログインして、ヘッダーの「サービス」 をクリックします。
一覧表示されるサービス名の中から、S3を選択しましょう。
S3を選択したら、バケットを作成をクリックしてバケットを作成します。
任意のバケット名を入力し、リージョンを「アジアパシフィック(東京)」にしましょう。
その後、ブロックパブリックアクセスのバケット設定をします。
以下のようにチェックをつけてください。
一番上の「ブロックパブリックアクセスのバケット設定」のチェックを外すと、以下のチェックボックスが選択可能になります。
チェックできたら他は特に変更せず、バケットを作成しましょう
バケットポリシー設定
作成したバケットをクリックして、「アクセス許可」からバケットポリシーの編集をします。
バケットポリシーに以下を貼り付けましょう。
{
"Version": "2012-10-17",
"Id": "Policy1544152951996",
"Statement": [
{
"Sid": "Stmt1544152948221",
"Effect": "Allow",
"Principal": {
"AWS": "ユーザーのARN"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::作成したバケット名"
}
]
}
できたら変更を保存をクリックします。
aws-sdk-s3を導入
ここからはrails側です。
まず、S3を使用するために必要なGemfileを導入します。
Gemfileに以下を追記
gem "aws-sdk-s3", require: false
#gemfile記述後
bundle install
production.rbを編集
production.rbの画像保存先をamazonの変更します。
config.active_storage.service = :amazon
storage.yml編集
strage.ymlを編集します。access_key_idとsecret_access_keyはこの後、環境変数に設定します。
local:
service: Disk
root: <%= Rails.root.join("storage") %>
## 以下を追記
amazon:
service: S3
region: ap-northeast-1
bucket: 作成した自身の「バケット名」を入力
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
環境変数を設定する
ターミナルで環境変数を設定します。
既に設定してある場合は飛ばしてもらって大丈夫です。
vim ~/.zshrc
iを押してインサートモードに移行した後、以下を追記
export AWS_ACCESS_KEY_ID="ご自身のCSVファイルのAccess key ID"
export AWS_SECRET_ACCESS_KEY="ご自身のCSVファイルのSecret access key"
追記後はescキーでインサートモードを終了した後、:wqで保存しましょう。
その後、ターミナルで以下のコマンドを打ちましょう。
source ~/.zshrc
Heroku上に環境変数を設定する(Herokuを使っている場合)
Herokuにあげている場合は環境変数を追加する必要があります。(EC2にデプロイしている人はおそらく既に設定してあると思います)
# ターミナル
% heroku config:set AWS_ACCESS_KEY_ID="自身のCSVファイルのAccess key ID"
# ターミナル
% heroku config:set AWS_SECRET_ACCESS_KEY="自身のCSVファイルのSecret access key"
#ターミナル
% git push heroku master
EC2であれば再びデプロイし直せば、S3に画像が保存されます。
以上です。