はじめに
こんにちは。アメリカ在住で独学エンジニアを目指している 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ロール作成手順
- AWSコンソール → IAM → 「ロール」 → 「作成」
- 信頼されたエンティティタイプ:AWS のサービス
- ユースケース:ECS タスク
- 上で作成したポリシーをアタッチ
- ロール名例:
ecs-task-role-ses
これで「SES送信を許可するロール」が完成します。
ECSへの割り当て
- ECS → 「タスク定義」 → 「新しいリビジョンを作成」
-
Task Role に
ecs-task-role-ses
を指定 -
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_id
や secret_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コンソールの送信履歴に記録されていれば成功です
まとめ
要素 | 内容 |
---|---|
ポリシー | どの操作を許可するかを定義 |
ロール | どのサービスがその操作を行うかを定義 |
参考資料