我正在努力使用云形成将文件从我的 S3 存储桶传输到我的 EC2 实例。我有以下文件:
"files" : {
"/var/www/text.txt": {
"source": "https://s3.amazonaws.com/bucket/test.txt",
"mode": "000644",
"owner" : "root",
"group" : "root"
},
"/var/temp/http.conf": {
"source" : "https://s3.amazonaws.com/bucket/httpd.conf",
"mode": "000644",
"owner" : "root",
"group" : "root"
},
"/var/temp/mime-types.conf": {
"source" : "https://s3.amazonaws.com/bucket/mime-types.conf",
"mode": "000644",
"owner" : "root",
"group" : "root"
}
}
其中test.txt是一个包含文本“text”的文件,另外两个是配置文件。
我已经更新了我对 test.txt 文件的权限,以便任何人都可以查看或下载它,并尝试使其通过 https 变为 http,并尝试删除其他两个文件。
到目前为止,/var/www/
将创建四个目录,但不/var/temp/
。/var/www/error
还将包含文件。
我以为这应该可以正常工作,但事实并非如此。我做错了什么吗?我正在遵循AWS 文档。
编辑 我查看了错误日志。输出如下。它显然找不到该文件:
2015-06-04 14:28:50,381 [ERROR] HTTP Error 404 : <?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>404 - Not Found</title>
</head>
<body>
<h1>404 - Not Found</h1>
</body>
</html>
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 159, in _retry
return f(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 283, in get_role_creds
resp.raise_for_status()
File "/usr/lib/python2.7/dist-packages/cfnbootstrap/packages/requests/models.py", line 834, in raise_for_status
raise HTTPError(http_error_msg, response=self)
HTTPError: 404 Client Error: Not Found
2015-06-04 14:28:51,208 [ERROR] HTTP Error 404 : <?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>404 - Not Found</title>
</head>
<body>
<h1>404 - Not Found</h1>
</body>
</html>
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 159, in _retry
return f(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 283, in get_role_creds
"cfn-init.log" [readonly] 1216L, 58277C
答案1
我认为您没有复制任何文件。您可能需要添加 IAMS3使用权角色您的实例-例如AmazonS3FullAccess
。我做了类似的事情,但我用该角色设置了我的实例,并且从 S3 复制文件到或aws s3 cp ...
整个目录aws s3 sync ...
。我把这些命令放在用户数据字段中,这样我就可以“设置实例,然后忘掉它”
答案2
要使 S3 文件副本能够与 S3 只读访问权限一起使用,您需要:
- 要将实例分配给实例配置文件(附加到实例角色,并具有对存储桶的只读访问权限),
[ "s3:Get*", "s3:List*" ]
- 定义
AWS::CloudFormation::Authentication
在您的部分旁边AWS::CloudFormation::Init
,并像下面一样配置角色。 确保您的
"source"
部分如下所示。"AWS::CloudFormation::Authentication" : { "default" : { "type" : "S3", "buckets" : [ { "Ref" : "ConfigBucket" } ], "roleName" : { "Ref" : "MyNodeRole" } } }, "AWS::CloudFormation::Init" : { "config" : { "files" : { "/etc/myapp/config/filename": { "source" : { "Fn::Join": [ "", [ "http://", { "Ref" : "ConfigBucket" }, ".s3-us-west-1.amazonaws.com/config/filename" ]]}, "mode": "000444", "owner": "root", "group": "root", "authentication": "default" } } } }
这source
链接需要是一个密钥。S3 存储桶的 AWS 文档状态:
存储在存储桶中的对象具有唯一的键值,可使用 HTTP URL 地址进行检索。例如,如果具有键值的对象
/photos/mygarden.jpg
存储在myawsbucket
存储桶中,则可使用 URL 进行寻址http://myawsbucket.s3.amazonaws.com/photos/mygarden.jpg
。
答案3
我遇到了与 OP 相同的问题。我的问题是我指定了角色 ARN,而不是角色名称。这导致我收到与 OP 相同的 404 错误。404 错误看起来好像我提供了错误的 S3 路径,但实际上是角色在cfn-init
使用。