我的 CloudFormation 模板中有一个 S3 存储桶作为资源,DeletionPolicy设置为Retain. 这按预期工作:删除堆栈时,它确实保留了存储桶。但是,当我尝试再次创建堆栈时,尝试再次创建同一个存储桶时创建失败,并显示一条错误消息,抱怨它已存在。
我需要向我的 CloudFormation 模板添加什么才能使其不尝试重新创建已存在的资源?
我的模板相关片段如下:
"Resources": {
"SomeS3Bucket" : {
"Type" : "AWS::S3::Bucket",
"DeletionPolicy" : "Retain",
"Properties": {
"BucketName": "SomeS3Bucket"
}
}
Run Code Online (Sandbox Code Playgroud) 使用 CloudFormation,我想在现有存储桶上设置AWS::S3::Bucket 中的一些属性。换句话说,我不想创建存储桶,我只想强制执行一些设置。这是我的 CloudFormation JSON 示例:
"websitePreviewBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"AccessControl": "PublicRead",
"VersioningConfiguration": {
"Status": "Suspended"
},
"BucketName": "preview.website.com",
"WebsiteConfiguration": {
"IndexDocument": "index.html",
"ErrorDocument": "error.html"
}
}
},
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,这在 CloudFormation 控制台中失败了:
The following resource(s) failed to create: [websitePreviewBucket].
preview.website.com already exists
Run Code Online (Sandbox Code Playgroud)
我已经创建了存储桶preview.website.com。我的意思是,这个帐户拥有那个存储桶。如何设置之类的东西AccessControl,并WebsiteConfiguration与CloudFormation现有的桶?
我看到另一个问题提出了类似的问题,但没有合适的答案。
有没有办法为从 CloudFormation 模板参数派生的常用值定义快捷方式?
例如-我有一个创建了ELB名字多AZ项目组的脚本project和ELB后面两个实例叫project-1和project-2。我只将ELBHostName参数传递给模板,然后使用它来构造:
"Fn::Join": [
".", [
{ "Fn::Join": [ "", [ { "Ref": "ELBHostName" }, "-1" ] ] },
{ "Ref": "EnvironmentVersioned" },
{ "Ref": "HostedZone" }
]
]
Run Code Online (Sandbox Code Playgroud)
这种结构或非常相似的结构在整个模板中重复多次 - 以创建 EC2 主机名、Route53 记录等。
而不是一遍又一遍地重复,我想将它的输出分配Fn::Join给某种变量并且只引用它,就像我可以用"Ref":语句一样。
理想情况下是这样的:
Var::HostNameFull = "Fn::Join": [ ... ]
...
{ "Name": { "Ref": "Var::HostNameFull" } }
Run Code Online (Sandbox Code Playgroud)
或类似简单的东西。
使用 Amazon CloudFormation 可以吗?
我是否遗漏了什么,但是否无法通过 CloudFormation 将路由添加到随 VPC 预配的默认路由表?
routing amazon-web-services amazon-route53 amazon-cloudformation
我有一个 cfn 堆栈(除其他外),它创建了一个 VPC、几个安全组和一些 EC2 实例。将在堆栈中创建的安全组分配给同样由堆栈创建的实例是很简单的。但是,我对默认的 VPC SG 感兴趣。
创建 VPC 后(无论是通过 GUI 手动、通过 cloudformation 还是任何其他方式),AWS 都会为该组中的任何实例创建一个带有“全部允许”规则的默认安全组。
我想要做的是将这个默认安全组和其他几个 SG 分配给堆栈创建的实例。事实证明,这比我预期的要困难得多。以下是一些片段,显示了我正在发生的事情:
"AllowSSHSecGroup":{
"Type":"AWS::EC2::SecurityGroup",
"Properties":{
"GroupDescription":"Allow SSH from anywhere",
"VpcId":{
"Ref":"DevVPC"
},
"SecurityGroupIngress":[
{
"IpProtocol":"tcp",
"FromPort":"22",
"ToPort":"22",
"CidrIp":"0.0.0.0/0"
}
]
}
},
"Instance001" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"ImageId" : "ami-7eab224e",
"InstanceType" : "m1.large",
"AvailabilityZone" : "us-west-2a",
"PrivateIpAddress" : "10.22.0.110",
"SecurityGroupIds" : [ {"Ref" : "AllowSSHSecGroup"} ],
"SubnetId" : { "Ref" : "PublicSubnet" },
"KeyName" : "erik-key",
"DisableApiTermination" : …Run Code Online (Sandbox Code Playgroud) 是否可以使用 cloudformation 堆栈强制重新创建 EC2 或 RDS 实例?
我的堆栈卡在一个点上,简单地销毁和创建资源就可以修复它,而不是我必须删除整个堆栈才能继续工作。
编辑:
这个问题打了我两次。首先,我创建了一个具有一些默认值的 AWS::RDS::Instance,然后尝试将其降级为 "EngineVersion" : "5.5"。更改它应该会发生一些中断,但是 mysql 实例无法从 5.6 降级到 5.5,因此堆栈处于 UPDATE_FAILED 状态,我无法在没有讨厌的技巧的情况下重新创建 RDS。
另一种情况是,我有几个“AWS::EC2::Instance”,它们显然从“UserData”下载并执行脚本,如果 Y 更改下载的脚本,我必须重新构建实例,而没有办法这样做。我再一次使用相同的讨厌的技巧来重新创建机器。
讨厌的伎俩:
我没有使用一台机器的自动缩放组,而是解决了更改属性中的可用区的两个问题......但让我感觉很糟糕
我有一个字符串,它由许多变量组成,我将这些变量用于许多不同的事物,例如标签和主机名。
有没有办法创建一个可重用的字符串,我可以通过模板引用它?
对此的任何想法将不胜感激。编辑:一个例子是传入 2 个参数,例如 ProjectName 和 Environment 加入它们
"Fn::Join" : [ "-", [ {"Ref":"ProjectName"}, {"Ref":"Environment"} ] ]
Run Code Online (Sandbox Code Playgroud)
并在许多地方使用结果
我对 AWS 服务很陌生。我正在尝试使用 AWS 云格式并创建了一个模板。该模板没有错误,我可以使用它创建机器。
但是我在模板中添加了一些配置,以便在启动期间安装 tomcat、git 和其他东西。但这不会发生在我身上。
这是我用于安装 tomcat 的部分代码:
"Resources": {
"Tomcat": {
"Type": "AWS::EC2::Instance",
"Metadata": {
"AWS::CloudFormation::Init": {
"config": {
"packages": {
"apt": {
"tomcat6": [],
"git": [],
}
}
}
}
},
Run Code Online (Sandbox Code Playgroud)
但是当我登录机器时既tomcat没有git也没有安装!
提前致谢。
我对这个不知所措。
99% 的时间 CloudFormation 都非常擅长为您提供某种您可以使用的调试消息,但是“无效请求”让我感到困惑,尤其是当资源开始非常简单时。
据说这是给我带来问题的资源(由 Ansible 生成的模板,因此 {{ ... }} 符号),
"DatabaseDNSRecord": {
"Type": "AWS::Route53::RecordSet",
"Properties": {
"HostedZoneId": "HOSTED_ZONE_ID",
"Name": "db.{{ item.env_name|lower }}v2.<DOMAIN>.com.",
"ResourceRecords": [
{
"Fn::GetAtt": [ "Database", "Endpoint.Address" ]
}
],
"Type": "CNAME"
},
"DependsOn": "Database"
}
Run Code Online (Sandbox Code Playgroud)
从我从文档中可以看出,所需的一切都存在,正确且格式正确。
我唯一能想到的是我将此资源添加到我之前创建的现有CloudFormation 堆栈中,该堆栈已经创建了该Database资源,作为记录,它是一个AWS::RDS::DBInstance(如果需要,也很乐意为此发布资源模板,没什么特别的) .
任何想法为什么我收到“无效请求”?
谢谢。
编辑:我在有和没有TTL相同错误的情况下都尝试过。
我正在编写一个 Cloudformation 配置文件来一次性创建一个网站。这包括创建 lambda 函数、创建 API 网关、设置 S3 存储桶、创建 Route 53 区域和记录。
迄今为止:
因此,domain.com可以毫无问题地提供 S3 存储桶中的文件。将 AWS URI 用于 API Gateway 可以https://trydsoonjc.execute-api.us-west-2.amazonaws.com/app/path/here毫无问题地工作。
我想要设置的是api.domain.com指向 API 网关以访问服务器的 API。
如何将 Route 53 连接到 API Gateway?
我现在的 Cloudformation 是这样的:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description" : "Website",
"Parameters": {
"DomainName": {
"Type" : "String",
"Description" : "The DNS name of …Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-cloudformation amazon-api-gateway