如何使用 Terraform 设置 AWS Glue(具体来说,我希望它能够抓取我的 S3 存储桶并查看表结构)。快速 Google 搜索找不到该特定服务。我想要交互的 S3 存储桶已经存在,我不想让 Glue 完全访问我的所有存储桶。
我已经提交了我的解决方案问答风格,但我很想知道是否有人对我如何做得更好有什么想法。
答案1
如果您对如何更好地做到这一点有任何建议,请提交答案,以便我下次做得更好。
我在此处的示例将密切反映我所处的情况。特别是,我想要与之交互的 S3 存储桶已经定义,并且我不想让 Glue 完全访问我的所有存储桶。
第一个组件是角色本身。Amazon 建议使用我在本节中使用的特定名称,以便角色可以从控制台用户传递到服务。如果不能接受,请查看参考部分中 Glue 手册的 IAM 角色部分。与样板“承担角色”不同的另一件事是“主体”和“服务”。
resource "aws_iam_role" "glue" {
name = "AWSGlueServiceRoleDefault"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "glue.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOF
}
下一个组件是将 AWSGlueServiceRole 托管策略附加到角色。Amazon 对此进行了预定义,以便角色拥有几乎所有需要的权限,以便开始工作。
resource "aws_iam_role_policy_attachment" "glue_service" {
role = "${aws_iam_role.glue.id}"
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole"
}
如果您尚未为 S3 存储桶定义策略,那么您可以定义您的策略并将其附加到同一块中的此粘合角色,如下所示:
resource "aws_iam_role_policy" "my_s3_policy" {
name = "my_s3_policy"
role = "${aws_iam_role.glue.id}"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::my_bucket",
"arn:aws:s3:::my_bucket/*"
]
}
]
}
EOF
}
如果您像我一样定义了该策略但已将其附加到另一个角色,那么您可以重新使用它并将其附加到粘合角色,如下所示:
resource "aws_iam_role_policy" "glue_service_s3" {
name = "glue_service_s3"
role = "${aws_iam_role.glue.id}"
policy = "${aws_iam_role_policy.my_s3_policy.policy}"
}
您在这里更改的文本以匹配您的配置将是策略选项/键的“my_s3_policy”。
我的回答部分复制了我的中等职位。