当前位置: 首页 > 知识库问答 >
问题:

通过CloudFormation CLi跨账户S3访问

阙繁
2023-03-14

我尝试通过运行以下命令,使用AWS CLI创建CloudFormation堆栈:

aws cloudformation create-stack --debug --stack-name ${stackName} --template-url ${s3TemplatePath} --parameters '${parameters}' --region eu-west-1

模板驻留在另一个账户的S3桶中,我们称这个账户为456。存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Example permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::123:root"
                ]
            },
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::cloudformation.template.eberry.digital/*"
        }
    ]
}

(“操作: * ”用于调试)。

现在来扭转一下。我登录到帐户456并运行

aws sts assume-role --role-arn arn:aws:iam::123:role/delegate-access-to-infrastructure-account-role --role-session-name jenkins

并将正确的环境变量设置为访问123。附加到角色的策略允许用户在调试时进行管理员访问,但仍然不起作用。

aws s3api list-buckets

然后显示账户 123 中的存储桶。

总结一下:

  • 在账户 456 拥有的 S3 存储桶中指定模板,在控制台的 CloufFormation 中指定模板,同时登录到账户 123 有效。
  • 使用 CLI 在账户 123 拥有的 S3 存储桶中指定模板是有效的。
  • 使用 CLI 在账户 456 拥有的 S3 存储桶中指定模板不起作用。

错误:

调用CreateStack操作时发生错误(ValidationError):S3错误:拒绝访问有关详细信息,请检查http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html

我不明白我做错了什么,我会感激任何想法。同时,我会将模板上传到所有使用它的帐户。

共有1个答案

轩辕天佑
2023-03-14

Amazon S3通过使用存储桶策略提供跨帐户访问。这些是IAM资源策略(应用于资源(在本例中为S3存储桶),而不是IAM主体:用户、组或角色)。您可以在Amazon S3开发人员指南中阅读有关Amazon S3如何授权访问的更多信息。

我对哪个账户是哪个账户有点困惑,所以我只想说,当您想将模板部署在一个AWS账户拥有的存储桶中作为不同AWS账户中的堆栈时,您需要此存储桶策略。例如,模板位于AWS账户111111111111拥有的存储桶中,您想使用该模板在AWS账户222222222222中部署堆栈。在这种情况下,您需要登录到账户222222222222并将该账户指定为存储桶策略中的主体。

以下是提供对另一个 AWS 账户的访问权限的示例存储桶策略;我在我自己的 CloudFormation 模板存储桶上使用它。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AWS_ACCOUNT_ID_WITHOUT_HYPHENS:root"
      },
      "Action": [
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:GetObjectTagging",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::S3_BUCKET_NAME",
        "arn:aws:s3:::S3_BUCKET_NAME/*"
      ]
    }
  ]
}

您需要使用12位帐户标识符作为您想要访问的AWS帐户,以及S3存储桶的名称(您可能会使用< code>"Resource": "*",但是我没有测试过)。

 类似资料:
  • 如果将对象放入不同帐户(“帐户B”)的“帐户A”所拥有的存储桶中,您将无法从“帐户A”(存储桶所有者)通过S3静态网站(http)访问文件。 无论在所有对象上授予GetObject的存储桶策略如何,也无论ACL是否在对象上启用,这都是正确的。 如果尝试通过S3API(控制台/cli)从帐户a下载文件,它可以正常工作 如果试图通过S3静态网站(http)从帐户a下载文件,如果文件是由帐户B上传的,则

  • 我看了一些其他帖子,试图复制他们所做的,但他们似乎都没有遇到与我相同的问题。基本上,我试图存储S3存储桶中的密钥列表,以便在我的Vue应用程序中迭代它们。我有下面的代码,你可以看到我有3个控制台。记录我试图打印文件值的语句。第一个完全按照我的预期打印,而第二个打印,而第三个根本不打印。因此,出于某种原因,它没有将文件的值持久化到s3之外。listObjectsV2()函数,这意味着我无法访问应用程

  • 我有两个桶: “source-bucket”(在AWS帐户88888888中)。 “目的地-桶”(在AWS帐户99999999中) 两个桶都启用了版本控制,并且位于同一区域(eu-west-1)。 在源桶中,我创建了一个具有以下设置的复制规则: 我选择了自动角色创建,它使用以下策略创建了一个角色: 根据这里找到的文档https://docs.aws.amazon.com/amazons3/late

  • 我正在使用AWS PHP sdk在S3上保存图像。文件是私下保存的。然后,我在Web应用程序中使用S3文件url显示图像缩略图,但由于文件是私有的,因此图像显示为损坏。 当用户单击文件名时,会打开一个模态以显示更大大小的文件,但由于相同的问题,文件也显示为损坏。 现在,我知道有两种方法可以让它发挥作用。1、公开文件。2、为文件生成预签名URL。但由于我项目的要求,我不能选择这两个选项中的任何一个。

  • 我有一个正在运行的Amazon EC2实例,它具有开放的IAM策略,可以调用通过调用公共S3 bucket来证明的任何资源。但是,如果我自己创建一个S3 bucket(带有一些。csv文件的mybucket)并提供bucket策略 要被EC2用户调用,我会得到以下错误。 为什么我会得到这个400错误代码?

  • 我有一个使用Google Drive的应用程序,它必须(a)不需要用户登录,(b)填充授权用户可以查看的文档。 正因为如此,如本文所述,使用常规帐户作为服务帐户似乎是我唯一的选择https://developers.google.com/drive/web/service-accounts 使用常规Google帐户作为应用程序拥有的帐户 你可以像任何用户一样,通过谷歌账户注册流程或在你的谷歌应用程

  • 我尝试了许多网站,但我找不到结果我想做什么。所以任何人都可以帮我解决这个问题吗? 我的问题是:我想向客户发送忘记密码的电子邮件。该电子邮件将在15分钟后过期。这是我的代码 我还添加了这个代码

  • 在玩过游戏之后。Net CIM XML API C#示例代码,我开始使用授权。Net C#SDK。我能够使用CIM XML API示例代码将信用卡和银行账户添加到客户配置文件中。不过,我不知道如何使用SDK添加银行账户。 使用CIM XML API添加银行账户: 使用SDK,我只看到一个方法,但无法添加银行帐户。当我循环查看我所有的时,遇到银行账户时也会抛出一个异常: 例外情况: 如何使用Auth