如何使用 Terraform 设置 AWS Glue?

rus*_*rce 3 amazon-web-services terraform

如何使用 Terraform 设置 AWS Glue(特别是我希望它能够抓取我的 S3 存储桶并查看表结构)。一个快速的谷歌搜索出现了该特定服务的枯竭。我想要与之交互的 S3 存储桶已经存在,我不想让 Glue 完全访问我的所有存储桶。

我已经提交了我的解决方案问答风格,但我很想知道是否有任何关于如何做得更好的想法。

rus*_*rce 5

如果您有关于如何做得更好的建议,请提交答案,以便我下次做得更好。

我在这里的示例将密切反映我所处的情况。特别是,我想要与之交互的 S3 存储桶已经定义,我不想让 Glue 完全访问我的所有存储桶。

第一个组成部分是角色本身。Amazon 推荐我在本节中使用的特定名称,以便角色可以从控制台用户传递到服务。如果不可接受,请查看参考部分中胶水手册的 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
}
Run Code Online (Sandbox Code Playgroud)

下一个组件是将 AWSGlueServiceRole 托管策略附加到角色。亚马逊预先定义了这一点,以便角色几乎拥有所有需要的权限,以便走出大门。

resource "aws_iam_role_policy_attachment" "glue_service" {
    role = "${aws_iam_role.glue.id}"
    policy_arn = "arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole"
}
Run Code Online (Sandbox Code Playgroud)

如果您还没有为您的 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
}
Run Code Online (Sandbox Code Playgroud)

如果像我一样,您定义了该策略但已经将其附加到另一个角色,那么您可以重复使用它并将其附加到胶水角色,如下所示:

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}"
}
Run Code Online (Sandbox Code Playgroud)

您在此处更改以匹配您的配置的文本将为策略选项/键的“my_s3_policy”。

我的回答部分复制到了我的Medium 帖子中