1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS S3を使って画像を保存する

Posted at

初めまして

私は、現在オリアプを製作し、herokuを使ってデプロイし、画像はAWS S3を使って保存することをしました。
今回は、AWSアカウント登録、IAMユーザー設定後からの備忘録になります。

S3を何故使うのか

  • herokuでデプロイをし、再度デプロイすると画像が消えてしまう
  • herokuの仕様で24時間に1回自動で再起動され消えてしまう
  • インフラやクラウドについても理解を深めたい

以上の3点のことから「S3」を使うことを決めました!

保存先の作成(バケット作成)

①AWS 「S3」のホームページでバケットを作成します。
②バケット名「任意でおk」、リージョン「東京を選択」

アクセス許可ですが、
③パブリックのアクセスを全てブロックのチェックを外します。
④新規のパブリックバケットポリシー〜、あらゆるパブリックバケットポリシ〜のチェックを外す。
⑤そうすると、下の欄に「警告マークとともにチェック欄」が出てくるのでチェックを入れます。
⑥バケット作成をクリック

この作業によってファイルのアップロードができる様になります!

バケットポリシーの設定をします

①AWS 「S3」のホームページで先ほど作成したバケットを選択します。
②アクセス許可をクリックします。
③画面を少しスクロールすると「バケットポリシー」という画面が出てくるので、「編集する」をクリックします。
④コードブロック内に下記を入力します。

{
   "Version": "2012-10-17",
   "Id": "Policy1544152951996",
   "Statement": [
       {
           "Sid": "Stmt1544152948221",
           "Effect": "Allow",
           "Principal": {
               "AWS": "ご自身のユーザーのARN"
           },
           "Action": "s3:*",
           "Resource": "arn:aws:s3:::作成したバケット名"
       }
   ]
}

⑤変更の保存をクリックすると完了です。

S3の設定

Ruby on rails Gemfileの一番下に

gem "aws-sdk-s3", require: false

上記を追記し、bundle installをします。

ローカル環境で画像の保存先をS3に変更します。

config/environments/development.rb

config.active_storage.service = :local
↓変更する
config.active_storage.service = :amazon

この作業により、画像の指定先がlocalからS3へ変更されます。

storage.ymlにバケット名とリージョン名を記述します。

config/storage.yml
test:
 service: Disk
 root: <%= Rails.root.join("tmp/storage") %>

local:
 service: Disk
 root: <%= Rails.root.join("storage") %>

amazon:
 service: S3
 region: ap-northeast-1 ← 日本に住んでる方はこちらを選択しているはずです
 bucket: ←は自分のバケット名を記入
 access_key_id: <%= S3のアクセスキー環境変数 %>
 secret_access_key:  <%= S3のシークレットアクセスキー環境変数] %>

気をつけていただきたいのは、必ずをアクセスキー、シークレットキーは環境変数にしてからデプロイする様にしてください。
秘密情報の漏洩になるのでご注意を!

本番環境で画像の保存先をS3します。

config/environments/production.rb

config.active_storage.service = :local
↓に変更
config.active_storage.servise = :amazon

ローカルの時と同じです!

herokuでも環境変数を使える様にします。

ターミナルでアクセスキー、シークレットキーをherokuに上げます。

heroku config:set 変数名="アクセスキーの値"

heroku config:set 変数名="シークレットキーの値"

これで本番環境でも使用することができます。

セキュリティ対策として

「git-secrets」というツールを使用して、誤ってAWSの秘密情報をpushしない様設定することもできます。

ホームディレクトリにて
brew install git-secrets

開発中のアプリにて
git secrets --install ←これでgit-secretsを使用できます
git secrets --register-aws --global ←AWS関連の秘密情報を一括で設定できます。

またGitHub Desktopを使用している場合

GitHub Desktopにも適応されます
sudo cp /usr/local/bin/git-secrets /Applications/GitHub\ Desktop.app/Contents/Resources/app/git/bin/git-secrets

今後全てのリポジトリに適応したい場合
git secrets --install ~/.git-templates/git-secrets
git config --global init.templatedir '~/.git-templates/git-secrets'

最後に

初めてクラウドを使ってみた感想は、意外と簡単に実装することができました。
複雑だなと感じた点は、セキュリティ面です。
今後開発していく上、セキュリティやクラウド、インフラは絶対に必要な知識の為、実装をしていく中でどんどん吸収していきたいと思います。

読んでいただきありがとうございました!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?