【Railsチュートリアル13章】本番環境での画像アップロードでS3を使う時の流れ(AWSキーを公開しないように.envを使う)
はじめに
Railsチュートリアル13章では、本番環境での画像アップロードのためにAWSのS3を導入しています。
しかし、初学者の私は導入完了までに2点ほどつまづいたので、下記に備忘録としてまとめます。
一つ目は、AWSシステムでS3を設定する流れについてです。
二つ目は、.envファイルを用い、AWSキー等をGitHubに公開しない方法についてです。
ちなみに私はGitHubの設定をPublicにしていたにも関わらず、.envファイルを使わなかったため、AWSキーを晒してしまいました...
AWSから何度もメールで警告を受けました...
そのメールが無かったら恐ろしいことになっていたかもしれません...
【実録】アクセスキー流出、攻撃者のとった行動とその対策
S3の設定にあたっては下記のUdemyを参考にしました。
S3以外についても丁寧に解説されているのでとてもおすすめです。
AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得
1. gemのインストール
aws-sdk-s3
gem をインストールして、本番アプリケーションでクラウドストレージを使えるよう設定します。
gem 'aws-sdk-s3', '1.46.0', require: false
を記載し、
$ bundle install
を実行。
2. S3の設定
※AWSアカウントがある前提で進みます。まだアカウントがない方は上記のUdemyを参考にしてください。
まずAWSのマネジメントコンソールを開いて、S3のダッシュボードに移動します。
右上の「バケットを作成」をクリックします。
「バケット名」を入力します。
「リージョン」は東京を選択してください。
「既存のバケットから設定をコピー」は無視します。
「ブロックパブリックアクセスのバケット設定」は全てチェックを外します。
その他については今回はデフォルトのままにしようと思います。
「バケットを作成」をクリックします。
上記の画像のようにS3のバケットが作成できていれば完了です。
ちなみに、バケットの名前とリージョン(ap-northeast-1)の情報は、これから先で必要になります。あとでコピペします。
3. IAMの設定
IAMのダッシュボードに移動します。
「ユーザー」をクリックし、次に「ユーザーを追加」をクリックします。
「ユーザー名」を入力し、「プログラムによるアクセス」を選択します。
「既存のポリシーを直接アタッチ」を選択します。
また検索ボックスにS3と入力し、ポリシー名に表示された「AmazonS3FullAccess」を選択します。
「タグの追加」は空欄のままにして、「次のステップ:確認」をクリックします。
成功画面が表示されるので、.csvをダウンロードします。
上記で表示されているアクセスキーIDとシークレットキーをこれから先で使用しますが、csvファイルに記載されているので、この画面は閉じるをクリックして問題ありません。
4. Herokuの変数設定
ターミナルに戻って、Herokuの設定をします。
②までで作成した「アクセスキーID」「シークレットキー」「リージョン」「バケットの名前」をそれぞれ下記に入力し、コマンドを実行します。
$ heroku config:set AWS_ACCESS_KEY=<accessキー>
$ heroku config:set AWS_SECRET_KEY=<secretキー>
$ heroku config:set AWS_REGION=ap-northeast-1(別リージョンなら別リージョン名)
$ heroku config:set AWS_BUCKET=<bucket名>
ちなみに、入力が正しかったか確認したい時は下記コマンドを実行します。
$ heroku config
5. envファイルの作成
上記で入力したシークレットキー等はconfig/storage.ymlに記載する必要がありますが、直接記載してGitHubにpushしてしまうと公開されてしまいます。
GitHubのリポジトリをPrivateにしていれば問題ありませんが、Publicに変える可能性がある場合、コミット履歴まで削除するのは難しいです...(初学者の私にはできませんでした)
そのため、envファイルを使用し、直接記載するのを避けます。
下記の記事を参考にしました。
Railsで使える環境変数を管理できるgem(dotenv-rails)や.envの導入方法
まず下記のgemをインストールします。
全ての環境で使えるように、Gemfileの一番上の集団のところに記載します。
gem 'dotenv-rails'
$ bundle install
config/storage.ymlに下記を記載します。
【注意】そのままコピペして下さい!実際のKEYの値などはenvファイルに記載します。
amazon:
service: S3
access_key_id: <%= ENV['AWS_ACCESS_KEY'] %>
secret_access_key: <%= ENV['AWS_SECRET_KEY'] %>
region: <%= ENV['AWS_REGION'] %>
bucket: <%= ENV['AWS_BUCKET'] %>
アプリケーションのトップに.envファイルを作成(Gemfile等と同じ位置)し、実際のKEY等を記載します。
ACCESS_KEY_ID = <あなたのaccessキー>
SELECT_ACCESS_KEY = <あなたのsecretキー>
REGION = ap-northeast-1(別リージョンなら別リージョン名)
BUCKET = <あなたのbucket名>
そして、.gitignoreファイル(隠しファイルで通常だと見えないかもしれないです)に.envを記載します。
.env
6. config/environments/production.rbの編集
Active Storageサービス設定パラメータを下記のように記載します。
# アップロードされたファイルをAWSに保存する
config.active_storage.service = :amazon
最後に
コミットしてデプロイします。
$ git add -A
$ git commit -m "任意のメッセージ"
$ git push
$ heroku pg:reset DATABASE
$ heroku run rails db:migrate
$ heroku run rails db:seed
Githubでは.envファイルが見れないことを確認してください。
Author And Source
この問題について(【Railsチュートリアル13章】本番環境での画像アップロードでS3を使う時の流れ(AWSキーを公開しないように.envを使う)), 我々は、より多くの情報をここで見つけました https://qiita.com/M0304/items/7c596964db85f927593d著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .