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

即使“aws s3 cp”可以工作,cfn-init也无法下载S3文件

丁学
2023-03-14

我有一个CloudFormation脚本,它使用AWS::CloudFormation::Init部分从S3存储桶下载一个文件,该文件因访问被拒绝而失败(403)。

我已经使用AWS::IAM::InstanceProfile向机器添加了名为s3access的IAM角色。使用aws s3下载文件有效:

[ec2-user@ip-172-31-26-26 ~]$ aws s3 cp s3://my-bucket/test-file 
.download: s3://my-bucket/test-file to ./test-file           

但是cfn-init失败了:

[ec2-user@ip-172-31-26-26 ~]$ sudo /opt/aws/bin/cfn-init -v --stack test --resource EC2 --region us-east-2
Error occurred during build: Failed to retrieve https://s3.us-east-2.amazonaws.com/my-bucket/test-file: HTTP Error 403 : 

我尝试显式设置IAM角色,但也失败了:

[ec2-user@ip-172-31-26-26 ~]$ sudo /opt/aws/bin/cfn-init -v --stack test --resource EC2 --region us-east-2 --role=s3access
AccessDenied: User: arn:aws:sts::196375698259:assumed-role/s3access/i-044499612c92b50f5 is not authorized to perform: cloudformation:DescribeStackResource on resource: arn:aws:cloudformation:us-east-2:196375698259:stack/test/*

我正在考虑使用aws s3 cp s3://my-hop/test-file./直接从用户数据,但我想知道为什么AWS::CLoudForjation::Init无法承担分配给EC2实例的角色。

我只发现了一个类似的问题——我如何在CFN脚本中访问受保护的S3文件?,但解决方案是应用IAM角色,我已经这样做了,但< code>cfn-init仍然失败。

共有2个答案

赖俊
2023-03-14

有一些方法可以为云形成实例提供您的IAM角色。

  • 您可以将IAM角色的标识放入云形成模板中,例如在您的UserData中。但是,这会给您的IAM带来一些机密问题。
  • 您可以将参数放在堆栈上,因此您可以在每次创建堆栈时指定IAM角色。这对于需要经常创建新堆栈的测试堆栈来说并不是很愉快。
  • 最后一个是启动一个新实例并添加您的IAM角色,然后创建该实例的AMI。使用此AMI创建云形成堆栈实例。通过使用此选项,您可以确保您的s3命令首先在实例上工作,并且您不必处理参数和机密问题。
易骁
2023-03-14

我需要将< code > AWS::cloud formation::authentic ation 添加到< code>EC2Instance的< code>Metadata中。详情请见:

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-authentication.html#cfn-cloudformation身份验证角色名

例如:

EC2Instance:
    Type: 'AWS::EC2::Instance'    
        Metadata:  
            AWS::CloudFormation::Authentication:  
                 rolebased:  
                     type: S3  
                     roleName: !Ref EC2InstanceIAMRole  
                     buckets:  
                         - !Ref TemplateBucket  
            ...  

该角色可以访问相关的< code>TemplateBucket。

角色也分配给EC2实例

有关该角色的一些详细信息如下:

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html

在添加这个之前,我可以通过aws-cli从s3下载文件,但cfn-init不起作用,出现以下错误:

Error occurred during build: Failed to retrieve https://s3.amazonaws.com/FILE: HTTP Error 403 : <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>ID</RequestId><HostId>ID</HostId></Error>  
 类似资料:
  • 在程序中, 给出错误- 在其他线程之后,我将JDK遵从性级别更改为1.7,还添加了 java.home=/home/user/jdk1.7.0_79/JRE java.library.path=/home/user/jdk1.7.0_79/jre/lib/i386/server:/home/user/jdk1.7.0_79/jre/lib/i386:/home/user/jdk1.7.0_79/j

  • 然而,下载URL与paremeters有一些有趣的地方,它看起来如下所示: (在url中,'&\;‘实际上没有'\',但我把它放在帖子中,以避免将其转义为'&')。 那么这里是什么情况;我是否有3个参数h、e、gd,或者我有一个参数h,其值,或者我有以下3个参数值对:,,(我认为是这样,而且似乎是一个bug)? 为了形成一个正确的http请求,我需要清楚地知道参数、名称和值是什么,但是我有一个令人

  • 问题内容: 我已经安装在Linux服务器上,并且将环境变量正确地设置为正确的目录,因为它已经安装了;但是,在尝试安装pyOpenSSL时,pip指出找不到文件’ffi.h’。我知道这两个目录及其目录都存在,所以如何缩小和之间的差距? 问题答案: 您可以在命令(的ditto )前面使用(以及其他各种编译器和链接器选项): 类似以下内容应起作用:

  • 问题内容: 我正在尝试在命令行上使用composer: 无论我做什么,我总是会收到相同的错误消息: 无法下载文件。打开流失败 我是代理人 。如果我使用浏览器并输入与不能在命令行上使用的URL相同的URL,那没有问题。 我该怎么办? 问题答案: 如果从HTTP代理后面使用composer,则可以使用标准或环境变量。只需将其设置为代理的URL。许多操作系统已经为您设置了此变量。 例如: 如果您在Lin

  • 我正在做一件我认为非常简单的事情来检查alpakka是否在工作:

  • 问题内容: 是否可以在每次执行循环时回显?例如: 我不想看到循环结束时打印所有内容,而是希望它每次都打印每个结果。 问题答案: 最终解决方案 这就是我发现的: Flush在Apache的mod_gzip或Nginx的gzip下不起作用,因为从逻辑上讲,它正在对内容进行gzip处理,并且这样做必须缓冲内容才能对其进行gzip处理。任何类型的Web服务器gzip压缩都会影响此。简而言之,在服务器端,我

  • 我正试图生成一个预先签名的URL,其中包含文档中可用的确切代码: https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/examples-s3-presign.html 但我有一个错误: 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。 知道文档代码为什么不起作用吗?这似乎与AWS签名V4有关。我不知道

  • 我在一个maven项目中使用Eclipse Neon.3中的Lombok 在执行更新Maven项目(Alt F5)时,一切都很好,但只要我更改任何文件并保存(自动生成),就会出现错误,即使用的Getter不存在。 插件安装正确,我可以看到行“龙目1.16.16版”舞蹈大象安装。https://projectlombok.org/“在Eclipse About Dialog中。我还可以在类的大纲中看