#はじめに
Railsでオリジナルアプリを制作しています。このアプリに画像投稿機能を実装しました。しかしHerokuでデプロイしたところ、24時間後には画像は表示されなくなりました(仕様です)。この問題を解決するため、AWS(Amazon Web Service)のS3(Simple Storage Service)を活用しました。今後も使用する機会がありそうなので、備忘録として書き記します。なお、AWS上のアカウント作成やセキュリティ対策方法は割愛します(別記事でまとめます)。
#手順
1.S3でバケット(データ格納場所)の準備
2.データ(今回は画像)保存先の設定
#1.S3でバケット(データ格納場所)の準備
バケット準備は大きく分けて下記2つの手順が必要です。
1-1.バケットの作成
AWSの公式サイトのサービスタブをクリックし、S3を選択します。その後「バケットを作成」をクリック。バケット名は誰かが既に使用していると、保存できないので注意。
1-2.バケットポリシーの設定
どのようなアクセスに対してS3への保存やデータの読み取りを許可するか決めます。
(今回はIAMユーザーで設定します。)
・サービスタグから検索窓にIAMを入力し、表示されたメニューをクリックする。
・左端のユーザーをクリックし、表示されたユーザー名をクリックする。
・ARNをコピーする。
・再びサービスタブからS3を選択し、対象のバケットを選択する。
・アクセス許可タブ、バケットポリシーの項目の編集するをクリックする。
(下記参照)
{
"Version": "2012-10-17",
"Id": "Policy1544152951996",
"Statement": [
{
"Sid": "Stmt1544152948221",
"Effect": "Allow",
"Principal": {
"AWS": "先ほどコピーしたARNを貼り付ける"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::対象のバケット"
}
]
}
#2.データ(今回は画像)保存先の設定
こちらも下記4つの手順が必要です。
2-1.必要なGemのインストール
Gemファイルに下記Gemを追加して、ターミナル上でインストールします。
gem "aws-sdk-s3", require: false
bundle install
2-2.保存先を指定
通常は保存先がlocalになっています。これをamazonに書き換えます。またローカル環境と本番環境では記述するファイルが異なるので注意する。
config.active_storage.service = :amazon
config.active_storage.service = :amazon
2-3.環境変数を設定
local:
service: Disk
root: <%= Rails.root.join("storage") %>
-------------------------------下記を追記----------------------------------
amazon:
service: S3
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
region: ap-northeast-1
bucket: 対象のバケット名
ターミナル上で環境変数を設定する。
vim ~/.zshrc
export AWS_ACCESS_KEY_ID="Access key IDの値をコピー"
export AWS_SECRET_ACCESS_KEY="Secret access keyの値をコピー"
設定できたら再びターミナルで設定を適用する。
source ~/.zshrc
2-4.動作確認
実際に保存してみて、AWS S3のページ対象のバケットにオブジェクトが追加されればOK
以上