7

我需要在属于第三方的一系列 AWS 账户的 S3 存储桶中获取一些 CSV 数据文件;其他帐户的所有者在每个帐户中创建了一个角色,授予我访问这些文件的权限;我可以使用 AWS Web 控制台(登录到我自己的帐户)切换到每个角色并获取文件。一次一个,我切换到每个帐户的角色,然后获取该帐户的文件,然后转到下一个帐户并获取这些文件,依此类推。

我想自动化这个过程。

看起来 AWS Glue 可以做到这一点,但我在权限方面遇到了问题。

我需要它做的是创建权限,以便 AWS Glue 爬虫可以切换到正确的角色(属于每个其他 AWS 账户)并从这些账户的 S3 存储桶中获取数据文件。

这可能吗?如果可以,我该如何设置?(例如,需要哪些 IAM 角色/权限?)如果可能的话,我宁愿将更改限制在我自己的帐户中,而不必要求其他帐户所有者在他们这边进行更改。

如果 Glue 无法做到这一点,是否有其他简单的方法可以使用不同的 AWS 服务来做到这一点?

谢谢!

(我已经进行了一系列尝试,但我一直弄错 - 我的尝试远非正确,因此我在此处发布详细信息毫无意义)。

4

3 回答 3

1

您可以使用 AWS lambda 和Cloudwatch Rules来实现这一点。

您可以创建一个附加了角色的 lambda 函数,让我们调用此角色 - Role A,具体取决于您可以为每个账户创建 1 个函数并在 cloudwatch 中创建一个规则以触发所有函数的帐户数量,或者您可以创建1个函数用于所有账户(注意AWS Lambda的限制)。

创建角色 A

  1. 使用以下策略创建一个 IAM 角色(角色 A),允许其代入包含数据的其他账户赋予您的角色。
{
    “版本”:“2012-10-17”,
    “陈述”: [
        {
            “席德”:“Stmt1509358389000”,
            “效果”:“允许”,
            “行动”: [
                "sts:AssumeRole"
            ],
            “资源”:[
                "",
                "",
                ……
                "
            ]// 来自包含数据的账户的所有 IAM 角色 ARN,或者如果每个账户都有 1 个函数,您可以选择拥有单独的角色
        }
    ]
}

此外,您还需要确保角色 A的信任关系政策文档中存在与所有帐户的信任关系。

  1. 角色 A附加到您将运行的 lambda 函数。您可以使用无服务器进行开发。现在,您的 lambda 函数附加了角色 A,并且角色 Asts:AssumeRole对在其他帐户中创建的角色具有权限。

  2. 假设您在 lambda 代码中为 1 个帐户创建了 1 个函数,您必须首先使用STS切换到另一个帐户的角色并获取临时凭证并将这些凭证传递给S3选项,然后再获取所需的数据。

如果您为所有账户创建了 1 个函数,则可以将角色 ARN 放在一个数组中并对其进行迭代,再次执行此操作时请注意 AWS lambda 的限制。

于 2017-12-24T19:41:27.023 回答
1

使用 AWS CLI,您可以为要切换到的每个角色创建命名配置文件,然后从 CLI 中引用它们。然后,您可以链接这些调用,引用每个角色的命名配置文件,并将它们包含在脚本中以自动化该过程。

切换到 IAM 角色(AWS 命令​​行界面)

角色指定一组权限,您可以使用这些权限访问所需的 AWS 资源。从这个意义上说,它类似于 AWS Identity and Access Management (IAM) 中的用户。当您以用户身份登录时,您将获得一组特定的权限。但是,您没有登录角色,但一旦以用户身份登录,您就可以切换到角色。这会暂时搁置您的原始用户权限,而是为您提供分配给该角色的权限。该角色可以在您自己的账户或任何其他 AWS 账户中。有关角色、其优势以及如何创建和配置角色的更多信息,请参阅 IAM 角色和创建 IAM 角色。

于 2017-12-24T16:39:35.107 回答
1

是的,您可以按照以下步骤使用 Glue 自动化您的场景:

  • 在您的 AWS 账户中创建一个 IAM 角色。此角色的名称必须以 AWSGlueServiceRole 开头,但您可以附加任何您想要的内容。为 Glue 添加信任关系,例如:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "glue.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    
  • 将两个 IAM 策略附加到您的 IAM 角色。名为 AWSGlueServiceRole 的 AWS 托管策略和提供对所有目标跨账户 S3 存储桶所需的访问权限的自定义策略,例如:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "BucketAccess",
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
          ],
          "Resource": [
            "arn:aws:s3:::examplebucket1",
            "arn:aws:s3:::examplebucket2",
            "arn:aws:s3:::examplebucket3"
          ]
        },
        {
          "Sid": "ObjectAccess",
          "Effect": "Allow",
          "Action": "s3:GetObject",
          "Resource": [
            "arn:aws:s3:::examplebucket1/*",
            "arn:aws:s3:::examplebucket2/*",
            "arn:aws:s3:::examplebucket3/*"
          ]
        }
      ]
    }
    
  • 将 S3 存储桶策略添加到每个目标存储桶,以允许您的 IAM 角色具有您在账户中授予它的相同 S3 访问权限,例如:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "BucketAccess",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::your_account_number:role/AWSGlueServiceRoleDefault"
          },
          "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
          ],
          "Resource": "arn:aws:s3:::examplebucket1"
        },
        {
          "Sid": "ObjectAccess",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::your_account_number:role/AWSGlueServiceRoleDefault"
          },
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::examplebucket1/*"
        }
      ]
    }
    
  • 最后,在您的账户(与目标跨账户 S3 存储桶位于相同区域)中创建 Glue 爬虫和作业,将跨账户 S3 存储桶中的数据 ETL 到您的账户。
于 2018-05-21T08:13:13.463 回答