質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

5722閲覧

EC2のIAMロールを使うには、railsアプリの設定ファイルはどのように書けばいいですか?

TakumaN

総合スコア120

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

2グッド

2クリップ

投稿2016/08/23 23:38

railsアプリをEC2で公開しようと思っています。

IAMロールを使うとAWSのクレデンシャル情報を使わなくていいと知り、EC2でIAMロールを使ったインスタンスを作りました。

これでAWS側の設定はできたと思うのですが、railsアプリ側の設定ファイル(クレデンシャル情報を書いている部分)はどうすれば良いのでしょうか?

現在は下記のようになっており、クレデンシャル情報をハードコーディングしている状態です。

rails

1config/environments/production.rb 2 3Rails.application.configure do 4 . 5 . 6 . 7 config.action_mailer.smtp_settings = { 8 :address => 'email-smtp.us-west-2.amazonaws.com', 9 :port => 2587, 10 :authetication => :login, 11 :user_name => 'ABCDEFGHIJK', 12 :domain => 'sample.com', 13 :password => 'abcdefghijklmn123456' 14 } 15 . 16 . 17 . 18end

rails

1config/initializers/carrierwave.rb 2 3CarrierWave.configure do |config| 4 config.fog_credentials = { 5 provider: 'AWS', 6 aws_access_key_id: 'ABCDEFGHIJK', 7 aws_secret_access_key: 'abcdefghijklmn123456', 8 region: 'ap-northeast-1' 9 } 10 . 11 . 12 . 13 . 14end
mmtootmm, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

config.fog_credentialsの方はaws_access_key_idaws_access_key_idを削除して代わりにuse_iam_profile: trueとしてみてください。

SES SMTPの方はちょっと難しいですが、できないことはありません。この公式ドキュメントを注意深く読んでみてください。
SES SMTPのユーザーIDはAWSのアクセスキーIDと同じで、SMTPのパスワードはAWSシークレットアクセスキーから生成できます。具体的にはメッセージ"SendRawEmail"をAWSシークレットアクセスキーを使ってHMAC-SHA256でハッシュしたものの先頭にバージョン番号であるバイト値"0x02"を付加した値をBase64エンコーディングした文字列です。

そして質問者様の目的が「クレデンシャル情報をハードコーディングしない」ということでしたら、AWSのアクセスキーID/AWSシークレットアクセスキーはproduction.rbが読みこまれるときに外部から取得し、そしてSMTPパスワードを生成しなければなりません。
どこから取得するかですが、EC2インスタンスのIAMロールの情報はインスタンスメタデータから取得できます。インスタンスメタデータはインスタンス内部からhttp://169.254.169.254/latest/meta-data/にアクセスすれば参照できます。IAMロールのクレデンシャル情報はその下のhttp://169.254.169.254/latest/meta-data/iam/security-credentials/<IAMロール名>でJSON形式で取得できます。

「なんか難しそう」とお思いかもしれませんが、SMTPパスワード生成処理自体はRubyならばお手軽に5,6行もコードを書けばできるはずです。
AWS SDKも結局はインスタンスメタデータにアクセスしてIAMロールのクレデンシャルを取得していたと思いますから、アプリの初期処理でIAMロールのクレデンシャルを取得しておき、config.fog_credentialsの方もその値を適用するのでもいいかもしれませんね。

投稿2016/08/24 02:16

guest1213

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakumaN

2016/08/24 23:13

ご回答ありがとうございます!とても勉強になります! dotenvでの管理も考えているのですが、どちらの方が良さそうでしょうか? あと、アプリの初期処理でIAMロールのクレデンシャルを取得して、適用させる方法もできたら教えていただけるとありがたいです。
guest1213

2016/08/25 06:49

回答しといてあれですが、本当にできるかなーと私も検証してみたところ、 残念ながらIAMロールのクレデンシャルは「一時的セキュリティ認証情報」であるようで、SES SMTPではサポート外でしたね。http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html IAMロール使うなら素直にSES APIを使おう、ということでしょう。ActionMailer + SESの場合はaws-sdk-railsを使うようです。https://github.com/aws/aws-sdk-rails
guest

0

SESのSMTPインターフェースを使う場合は認証情報を省略できないので AWS SDK の SendEmail もしくは SendRawEmail を使うようにします。

Rails の場合は aws-sdk-rails gem を使えば Rails の Action Mailer と SES を統合できるようです。

使い方は GithubのReadmeに書かれてますが config/environments/production.rb に 次の設定を行えば良いようです。

Ruby

1config.action_mailer.delivery_method = :aws_sdk

投稿2016/08/30 08:25

take88

総合スコア1351

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問