作者:大海2502902497 | 来源:互联网 | 2023-07-29 09:32
我想应用以下Terraform aws_iam_policy_document
data source:
statement {
sid= "DeleteTmpTable"
actiOns= [
"glue:Deletetable",]
resources = [
"arn:aws:glue:eu-west-1:${data.aws_caller_identity.current.account_id}:table/compan-${terraform.workspace}/*_[0-9]+","arn:aws:glue:eu-west-1:${data.aws_caller_identity.current.account_id}:database/company-${terraform.workspace}","arn:aws:glue:eu-west-1:${data.aws_caller_identity.current.account_id}:catalog"
]
}
所以我只能在table_name_454044243243
之类的表上允许粘胶删除表,但table_name_blablabla
之类的表则不可删除。
但是我在可用的正则表达式上找不到任何信息。
这更多是AWS IAM限制而不是Terraform限制。 IAM allows for either multi character wildcards (*
) or single character wildcards (?
) but not arbitrary regexes.
尽管Terraform supports regexes对此没有帮助,因为您需要创建一个无效的IAM策略。
您可以做的一个选择是使用Terraform插值受IAM策略影响的资源,因此IAM策略将按字面意义列出所有受影响的资源,而不是作为正则表达式或通配符匹配。
如果您正在使用Terraform创建AWS Glue表,则可以执行以下操作:
variable "tables" {
default = [
"table_name_454044243243","table_name_454044243244",# ...
]
}
resource "aws_glue_catalog_table" "example" {
for_each = toset(tables)
name = each.key
database_name = "MyCatalogDatabase"
}
data "aws_iam_policy_document" "example" {
statement {
sid= "DeleteTmpTable"
actiOns= [
"glue:DeleteTable",]
resources = values(aws_glue_catalog_table.example)[*].arn
}
}
如果您还没有使用Terraform创建Glue表,那么另一种选择是使用external data source进行外壳处理并使用AWS CLI which does support matching by regex with the --expression
parameter或Boto 3's get_tables
method获取Glue表。未经测试的示例可能类似于以下内容:
data "external" "example" {
program = ["python","${path.module}/example-get-tables.py"]
query = {
database_name = "MyCatalogDatabase"
expression = "compan-${terraform.workspace}/*_[0-9]+"
}
}
data "aws_iam_policy_document" "example" {
statement {
sid= "DeleteTmpTable"
actiOns= [
"glue:DeleteTable",]
resources = data.external.example.tables
}
}
#!/usr/bin/env python3
import json
import sys
import boto3
glue_client = boto3.client('glue')
query = json.loads(sys.stdin)
respOnse= glue_client.get_tables(
DatabaseName=query["database_name"],Expression=query["expression"]
)
tables = [table["name"] for table in response["TableList"]]
print(json.dumps("tables": tables))
全部失败,我强烈建议您为资源分配更好的名称空间,以便即使您可以控制表的创建方式,也可以在IAM策略中使用*
通配符匹配前缀或后缀。