0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】IAMロールとポリシーを理解してRailsからSESを安全に使う

Posted at

はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
ついにMVPが完成し、あとはデプロイするだけ!というところまで来ました。
今回は、前回はハンズオンでデプロイに関する記事を書きましたが、今回は概念として】IAMロールとポリシーについて説明します。


1. IAMポリシーとロールの概要

ポリシー(Policy)

ポリシーは「どのアクションを、どのリソースに対して許可または拒否するか」を定義するドキュメントです。
JSON形式で記述し、具体的な操作権限を細かく制御します。

例:

{
  "Effect": "Allow",
  "Action": ["ses:SendEmail"],
  "Resource": "*"
}

この例では「SESのSendEmailアクションを許可する」という意味になります。


ロール(Role)

ロールは「特定の権限を持つ立場(実行者)」を定義するものです。
ポリシーを1つ以上アタッチして、「どのサービスが、どの権限でAWSを操作できるか」を指定します。

ECSで言えば:

  • タスクロール(Task Role):RailsアプリがAWSのAPIを呼び出すためのロール
  • 実行ロール(Execution Role):ECSがコンテナイメージ取得やログ出力を行うためのロール

今回の目的は、RailsアプリがSESを使えるようにするため、
タスクロール にSES用のポリシーをアタッチします。


2. ECS × IAM × SES の関係図

[Railsアプリ(ECSコンテナ)]
       │
       ▼
  [IAMロール] ← (ポリシー: ses:SendEmail を許可)
       │
       ▼
  [Amazon SES]

RailsはAWS SDKを通じてSESを呼び出します。
このときECSが自動的にIAMロールの一時的な認証情報(STSトークン)を提供するため、
Rails側でアクセスキーを記述する必要はありません。


3. SES送信用ポリシーの作成

IAMコンソール → 「ポリシー」 → 「作成」 → 「JSON」タブに以下を貼り付けます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowSendEmail",
      "Effect": "Allow",
      "Action": [
        "ses:SendEmail",
        "ses:SendRawEmail"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": "ap-northeast-1"
        }
      }
    }
  ]
}

各項目の意味

キー 内容
"Action" SESでメール送信する操作を許可 (SendEmail, SendRawEmail)
"Resource": "*" すべてのSESリソース(送信元ドメインなど)を対象
"Condition" 東京リージョン(ap-northeast-1)のみで許可
"Effect": "Allow" 上記アクションを許可

このポリシーは「東京リージョンでSESを使ってメール送信を許可する」という意味になります。


4. IAMロールの作成とECSへの割り当て

IAMロール作成手順

  1. AWSコンソール → IAM → 「ロール」 → 「作成」
  2. 信頼されたエンティティタイプ:AWS のサービス
  3. ユースケース:ECS タスク
  4. 上で作成したポリシーをアタッチ
  5. ロール名例:ecs-task-role-ses

これで「SES送信を許可するロール」が完成します。


ECSへの割り当て

  1. ECS → 「タスク定義」 → 「新しいリビジョンを作成」
  2. Task Roleecs-task-role-ses を指定
  3. Execution Role はデフォルト(ecsTaskExecutionRole)でOK

5. RailsでSESを利用する設定

Gemfile に以下を追加してインストールします。

gem "aws-sdk-ses", "~> 5"
gem "aws-actionmailer-ses", "~> 1"

次に、config/environments/production.rb に以下を追加:

config.action_mailer.delivery_method = :ses_v2
config.action_mailer.ses_settings = {
  region: "ap-northeast-1"
}

ECSタスクロールを設定しているため、
access_key_idsecret_access_key は不要です。
AWS SDKが自動的にECSのロール情報を検出します。


6. メール送信の確認

# app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  default from: "no-reply@example.com"

  def welcome(user)
    @user = user
    mail(to: user.email, subject: "Welcome to our service")
  end
end

Railsコンソールで実行:

rails c
UserMailer.welcome(User.first).deliver_now

SESコンソールの送信履歴に記録されていれば成功です

まとめ

要素 内容
ポリシー どの操作を許可するかを定義
ロール どのサービスがその操作を行うかを定義

参考資料

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?