概要
Amazon Redshiftには、クエリやSQLをスケジュール実行できる機能があります。
その際に必要となるIAMロールや権限周りについて、AWS初心者の私にとって学びが多かったのでまとめてみました。
同じ初心者の方の参考になればと思います!
前提知識
- Redshift:AWSが提供するデータウェアハウスサービス
 - ロール:権限のかたまり。ユーザーやサービスに付与する
 - ポリシー:どのリソースに対して、どんな操作ができるを定義。ロールに付与する
 
ロールはポリシーの集合。ポリシーは実際にユーザ、サービスが何をできるのか指定するもの、
と理解してます!
Redshiftのスケジュール機能とは?
- クエリを定期的に実行するための機能
 - 今回はコンソールで設定する場合を想定
 - 実行時には「どのロールで実行するか」を指定する必要がある
 
背景
スケジュール実行の機能を実行しようしたところ権限不足のエラーが出てしまいました。
FullAccess権限を与えるのはセキュリティ的によくないので、必要なポリシーに絞ってロールに付与することにしました。
必要な権限
1. スケジュール実行用のIAMロールに付与するポリシー
- 
ロールに対して以下の許可ポリシーを付与
- Redshiftで保存済みのクエリの一覧を取得できるようにする
 - スケジュールクエリでは、「QS2-」で始まる EventBridge のルールを作成するので、
「QS2-」で始まるリソースにだけ限定して、それ以外のリソースに影響が出ないようにする - Redshiftが指定のIAMロールを使って実行できるように許可する
 
 - 
ロールに対して以下の信頼ポリシーを付与
- スケジュールクエリの削除は、スケジュールクエリを実行するための IAM ロールへ Assume Role できるように設定する
 
 
許可ポリシー、信頼ポリシーについては以下を参考にしてみてください
ロール、ポリシーについても書いてあります!
【PART11 IAMロール】ぜんぜんわからなかったIAMについてまとめてみました
自分でもまとめました
- 許可ポリシー:「このロール/ユーザーは何ができるか?」を定義
 - 信頼ポリシー:「誰がこのロールを引き受けられるか?」を定義
 
あとAssume Roleは、このあとの実装例でPass Roleというのが出てきます。
先ほどの参考資料にも書いてありますが、例によって自分でまとめました
- PassRole:サービスに対して、指定のIAMロールを使わせること
 - Assume Role:別のIAMロールに切り替えて、そのロールの権限で直接操作する」こと
 
スケジュール実行というよくある機能ですが、このあたりの権限は理解しずらいですね、、、
このあたりについては後述の具体例でまた説明します!
2. Redshift内の権限
- 
クエリを実行するユーザーに対して以下が必要
- 
CREATE SCHEDULE権限 - 対象スキーマやテーブルへの 
SELECT/INSERT/UPDATE権限 
 - 
 
実際の設定例
「2.Redshiftの権限」について別の機会でまとめるとして、
今回は「1. スケジュール実行用のIAMロール」の実装例について説明します
スケジュール実行用のIAMロール:redshift-sche-role
- 許可ポリシー
 
redshift-sche-roleはどのような権限を持つか、以下のポリシーで定義されています
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListSavedQuery",
            "Effect": "Allow",
            "Action": "redshift:ListSavedQueries",
            "Resource": "*"
        },
        {
            "Sid": "EventBridge",
            "Effect": "Allow",
            "Action": [
                "events:PutRule",
                "events:PutTargets",
                "events:RemoveTargets",
                "events:DeleteRule",
                "events:DescribeRule",
                "events:Describe*",
                "events:DisableRule",
                "events:EnableRule"
            ],
            "Resource": "arn:aws:events:[リージョン名]:[アカウントID]:rule/QS2-*"
        },
        {
            "Sid": "PassRole",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::[アカウントID]:role/redshift-sche-role"
        }
    ]
} 
- 信頼ポリシー
redshift-sche-roleロールをどのIAMユーザ/ユーザが引き受けられるか以下に定義されています 
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "events.amazonaws.com",
                    "redshift.amazonaws.com",
                    "redshift-serverless.amazonaws.com"
                ],
                "AWS": [
                    "[IAMユーザ/ユーザのarn]"
                ]
            },
            "Action": [
                "sts:AssumeRole",
                "sts:SetContext"
            ]
        }
    ]
}
そもそもなぜ信頼ポリシーが必要かというと、スケジュールの削除には実行用のロールをユーザにAssumeする必要があるからです。
今回で言うとredshift-sche-roleをアカウントにログインしているIAMユーザ/ユーザにAssumeできる権限が必要です。
また、許可ポリシーのPassRoleはRedshiftがredshift-sche-roleを使ってスケジュールの作成等をするのに必要です。
ややこしい、、、
まとめ
- Redshiftのスケジュール機能は便利だが、IAMロール + DB権限 両方の設定が必要
 - 実行時の「ロールの指定」を忘れると動かない
 - 権限を最小限に絞ることでセキュリティを担保できる
 
ロールとポリシーについては何となく理解していましたが、AWS独自の権限について学べるいい機会でした!