如何让AWS Glue抓取工具在另一个AWS账户中担任角色,以从该账户的S3存储桶中获取数据?

时间:2017-12-24 16:05:17

标签: amazon-web-services amazon-s3 amazon-iam aws-glue

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

我想自动化这个过程。

看起来AWS Glue可以做到这一点,但我的权限有问题。

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

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

如果使用Glue无法实现,是否还有其他一些简单的方法可以使用其他AWS服务?

谢谢!

(我已经进行了一系列的尝试,但我一直都错了 - 我的尝试远远不对,我在这里发布详细信息没有意义。)

3 个答案:

答案 0 :(得分:1)

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

来自Switching to an IAM Role (AWS Command Line Interface)

  

角色指定可用于访问AWS的一组权限   您需要的资源。从这个意义上说,它类似于AWS中的用户   身份和访问管理(IAM)。当您以用户身份登录时,您   获取一组特定的权限。但是,您没有登录   角色,但一旦以用户身份登录,您就可以切换到角色。这个   暂时保留原始用户权限,而不是   为您提供分配给角色的权限。角色可以在   您自己的帐户或任何其他AWS账户。有关的更多信息   角色,它们的好处以及如何创建和配置它们,请参阅IAM   角色和创建IAM角色。

答案 1 :(得分:1)

您可以使用AWS lambda和Cloudwatch Rules实现此目的。

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

创建角色A

  1. 使用以下策略创建IAM角色(角色A),允许其承担包含数据的其他帐户为您提供的角色。
  2. {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Stmt1509358389000",
                "Effect": "Allow",
                "Action": [
                    "sts:AssumeRole"
                ],
                "Resource": [
                    "",
                    "",
                    ....
                    "
                ]// all the IAM Role ARN's from the accounts containing the data or if you have 1 function for each account you can opt to have separate roles
            }
        ]
    } 

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

    1. 角色A 附加到您将要运行的lambda函数。您可以使用serverless进行开发。 现在,您的lambda函数附加了角色A ,而角色A 对其他帐户中创建的角色具有sts:AssumeRole权限。

    2. 假设您已在lambda代码中为1个帐户创建了1个函数,则必须先使用STS切换到其他帐户的角色并获取临时凭据并通过在获取所需数据之前,这些选项为S3选项。

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

答案 2 :(得分:0)

是的,您可以按照以下步骤使用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/*"
        }
      ]
    }
    
  • 最后,在您的帐户中创建Glue抓取工具和作业(与目标跨帐户S3存储桶位于相同的区域),这样可以将来自跨帐户S3的数据存储到您的帐户。