Active Storageの画像をAWSのS3へ保存する
開発環境
- macOS
- VSCode
- Rails-7.1.3.3
- ruby-3.2.3
- PostgreSQL-16.2
行いたいこと
- Herokuのデプロイ環境では、アプリケーションのファイルシステムは
揮発性ストレージ
を使用しています。そのため、デプロイやアプリケーションの再起動時にファイルシステムの変更が失われてしまいます。 - 今回は画像のデータを永続的に保存するために、
AWS
のS3
を導入したのでその流れを記載します。
前提として
- 既にActive Storageで画像を正しく保存できている
- AWSのアカウントは作成済み
- Herokuにはデプロイ済み
AWSのS3でバケットを作成する
東京
に変更する。(デフォルトはバージニア北部
となっている)
・リージョンを
S3
と入力しS3
を選択する。
・検索欄に
バケット
を作成する。
・
バケットの一般的な設定
(この設定以外はデフォルト)
・
バケットのブロックパブリックアクセス設定
・・パブリックアクセスをすべてブロック
のチェックを外す。
・画像のように下の2つ
にチェックを入れる。 ⇨ 表示される承認します
にチェックを入れる。
・バケットを作成
を選択
IAMポリシーの作成
IAM
と入力しIAM
を選択する。 ⇨ ポリシー
を選択する。 ⇨ ポリシー
の作成
・検索欄で
・アクセス許可を指定
・S3
タブを展開しリスト
、読み取り
、書き込み
、許可の管理
、をそれぞれ選択する
・リスト ⇨ ListBucket
・読み取り ⇨ GetObject
・書き込み ⇨ DeleteObject
とPutObject
・許可の管理 ⇨ PutObjectAcl
・リソース⇨bucket
のみARNを追加
を選択し記載
・リソースバケット名
に作成したバケット名を記載する(リソースARN
は自動で記載される)
⇨ ARNを追加
⇨ 次へ
・ポリシーの詳細
・ポリシー名
のみ記載(説明-オプション
は不要)
・ポリシーの作成
IAMユーザーの作成
・ユーザータブを選択 ⇨ ユーザーの作成
・許可を設定
・ポリシーを直接アタッチする
を選択する ⇨ 検索欄で先ほど作成したIAMポリシー
を検索する
⇨ ポリシーを選択 ⇨ 次へ
・ユーザーの詳細、許可の概要を確認して ⇨ ユーザーの作成
アクセスキーを作成
ユーザータブ ⇨ ユーザー名を選択
・セキュリティ認証情報タブ ⇨ アクセスキーを作成
・主要なベストプラクティスと代替案にアクセスするの設定
・AWS の外部で実行されるアプリケーション
を選択する ⇨ 次へ
・説明タグを設定-オプション
・説明タグを設定-オプション
は不要なのでそのままアクセスキーを作成
バケットポリシーの設定
アクセス許可タブ
を選択する
・作成したバケットへ移動し
編集
を選択
・バケットポリシーの
・画像のように記載しました。
コード
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "ユーザーページからARNをコピーして貼り付け"
},
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::バケット名",
"arn:aws:s3:::バケット名/*"
]
}
]
}
ファイルへの記載
・gem 'aws-sdk-s3'の追加
・Gemfile
に追記
gem 'aws-sdk-s3'
・bundle install
を実行
$ bundle install
・config/credentials.yml.enc への記載(隠しファイル)
記載内容
アクセスキー
、シークレットアクセスキー
、リージョン
、バケット名
の4つを記載していく
vim
で記載していく
・このファイルはエディターから直接記載ができないので・コンテナに入り
$ docker-compose exec web bash
・ファイルを指定しvim
で開く
$ EDITOR="vim" rails credentials:edit
・このような記載になっていると思うので...
# aws:
# access_key_id: 123
# secret_access_key: 345
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: ・・・・・・・・・・・・・・・・・・・省略・・・・・・・・・・・・・・・・・・・
・必要事項を追記する(:
の後のスペースや改行に気をつける)
# aws:
# access_key_id: 123
# secret_access_key: 345
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: ・・・・・・・・・・・・・・・・・・・省略・・・・・・・・・・・・・・・・・・・
aws:
access_key_id: アクセスキー
secret_access_key: シークレットアクセスキー
region: リージョン
bucket: バケット名
・保存コードの確認方法
コンソールから確認(Rails.application.credentials.aws)
・コンソールを開く
$ rails c
・Rails.application.credentials.aws
irb(main):001> Rails.application.credentials.aws
=> {:access_key_id=>"アクセスキー", :secret_access_key=>"シークレットアクセスキー",
:region=>"リージョン", :bucket=>"バケット名"}
コンテナから確認(rails credentials:show)
・コンテナに入る
$ docker-compose exec web bash
・rails credentials:show
root@b7f741d3e5aa:/myapp# rails credentials:show
・ファイルのコードがそのまま表示される
# aws:
# access_key_id: 123
# secret_access_key: 345
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: ・・・・・・・・・・・・・・・・・・・省略・・・・・・・・・・・・・・・・・・・
aws:
access_key_id: アクセスキー
secret_access_key: シークレットアクセスキー
region: リージョン
bucket: バケット名
・保存に成功した場合と失敗した場合の表示
・config/storage.yml への記載
・vim
で記載した隠しファイルconfig/credentials.yml.enc
を正しく参照できるように、
インデント
と改行
に気をつける。
local:
service: S3
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
region: <%= ENV['AWS_REGION'] %>
bucket: <%= ENV['AWS_BUCKET'] %>
amazon:
service: S3
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
region: <%= ENV['AWS_REGION'] %>
bucket: <%= ENV['AWS_BUCKET'] %>
・config/environments/development.rb への記載
config.active_storage.service = :amazon
・config/environments/production.rb への記載
config.active_storage.service = :amazon
Herokuに環境変数を記載
設定
⇨設定変数
⇨鍵
と価値
に値を入力し追加
・Herokuのダッシュボードから、・設定
タブ
・鍵
と価値
に値を入力し追加
・環境変数
を記載(config/storage.ymlファイル
が参照できるように正しく記載)
・ターミナルからHerokuの環境変数を確認する
Herokuの環境変数を確認(heroku config)
・heroku config
$ heroku config
・Herokuに登録されている環境変数が全て表示される
AWS_ACCESS_KEY_ID: アクセスキー
AWS_BUCKET: バケット名
AWS_REGION: リージョン
AWS_SECRET_ACCESS_KEY: シークレットアクセスキー
開発環境にも環境変数を記載する
.env
に環境変数を記載する
・隠しファイルAWS_ACCESS_KEY_ID=アクセスキー
AWS_SECRET_ACCESS_KEY=シークレットアクセスキー
AWS_REGION=リージョン
AWS_BUCKET=バケット名
以上でAWSのS3へ保存の設定は完了です。
Discussion