概要
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:ap-northeast-1:[アカウント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独自の権限について学べるいい機会でした!