Terraformのsnowflake_grant_privileges_to_roleでハマった話
はじめに
私が所属しているライフイズテックのデータ基盤グループでは、Snowflakeの権限管理にTerraformを用いています。
TerraformでSnowflakeのアクセス制御を管理するで紹介しているように、導入当初のTerraformバージョンでは、権限設定のコードが冗長で管理が難しくなるという課題を抱えていました。
そこで、v0.68.0で導入されたsnowflake_grant_privileges_to_roleでの権限設定へ更新した際にOWNERSHIP
についての設定でハマった問題をまとめます。
起こったこと
以前のsnowflake_database_grant
やsnowflake_schema_grant
などを使っていた際は、OWNERSHIP
はUSAGE
と同様に下記にように設定が可能でした。
resource "snowflake_database_grant" "g1" {
database_name = snowflake_database.xxx.name
privilege = "OWNERSHIP"
roles = [
"ACCOUNTADMIN"
]
with_grant_option = false
}
resource "snowflake_database_grant" "g2" {
database_name = snowflake_database.xxx.name
privilege = "USAGE"
roles = [
"ACCOUNTADMIN"
]
with_grant_option = false
}
そのためOWNERSHIP
の権限についても他の権限と同様にsnowflake_grant_privileges_to_role
を使うように修正を加えました。しかしOWNERSHIP
以外の権限を設定した場合は成功するにも関わらず、OWNERSHIP
に関するリソースについては失敗するという事象に悩まされました。
resource "snowflake_grant_privileges_to_role" "g1" {
role_name = "SYSADMIN"
privileges = ["USAGE", "MONITOR"]
on_account_object {
object_type = "DATABASE"
object_name = snowflake_database.xxx.name
}
}
resource "snowflake_grant_privileges_to_role" "g1" {
role_name = "ACCOUNTADMIN"
privileges = ["OWNERSHIP"]
on_account_object {
object_type = "DATABASE"
object_name = snowflake_database.xxx.name
}
}
OWNERSHIP
を使ったリソースについては下記のエラーが発生しました。
GRANT OWNERSHIPのドキュメントを確認すると、依存権限が存在する場合は依存権限を事前に取り消すか、明示的にコピーするかしないといけないということが原因でした。
Error: error granting privileges to account role: 003036 (23001): SQL execution error: Dependent grant of privilege 'ADD SEARCH OPTIMIZATION' on securable 'XXX' to role 'YYY' exists. It must be revoked first. More than one dependent grant may exist: use 'SHOW GRANTS' command to view them. To revoke all dependent grants while transferring object ownership, use convenience command 'GRANT OWNERSHIP ON <target_objects> TO <target_role> REVOKE CURRENT GRANTS'.
対応策
Snowflakeのエンジニアのコメントによると、snowflake_grant_privileges_to_role
はOWNERSHIP
を操作するためには、作られていないとのことで、今後登場するsnowflake_grant_ownership
を待つ必要があります。
ということで、当面の間は以前のままsnowflake_database_grant
やsnowflake_schema_grant
を利用し続けるという回避を行うことになります。
resource "snowflake_database_grant" "g1" {
database_name = snowflake_database.xxx.name
privilege = "OWNERSHIP"
roles = [
"ACCOUNTADMIN"
]
with_grant_option = false
}
宣伝
ライフイズテック サービス開発部では、月毎に気軽にご参加いただけるカジュアルなイベントを実施しています。開催予定のイベントは、 connpass のグループからご確認ください。興味のあるイベントがあったらぜひ参加登録をお願いいたします。皆さんのご参加をお待ちしています!
Discussion