我的 CloudFormation 模板创建了一个自动缩放组并使用实用程序脚本 /opt/aws/bin/cfn-init 对其进行引导。当我从模板中删除引导程序部分时,自动缩放创建没有任何问题,但我添加它 CloudFormation 堆栈失败并在 /var/log/cloud-init.log 中添加行:
Error: AutoScalingGroupName does not specify any metadata
Run Code Online (Sandbox Code Playgroud)
上面的行紧跟在以下命令之后:
/opt/aws/bin/cfn-init --verbose --configsets orderedConfig --region us-east-1 --stack AS15 --resource AutoScalingGroupName --access-key XXXXXXXXXXXXX --secret-key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)
深入挖掘一点,在 cfn-init 中,我在退出点添加了以下几行:
from pprint import pprint
pprint(vars(detail))
Run Code Online (Sandbox Code Playgroud)
在运行之前的 cfn-init 命令时,我得到以下跟踪:
{'_description': None,
'_lastUpdated': datetime.datetime(2012, 7, 12, 14, 52, 42),
'_logicalResourceId': u'AutoScalingGroupName',
'_metadata': None,
'_physicalResourceId': u'AS15-AutoScalingGroupName-HNPOXXXXXXXX',
'_resourceStatus': u'CREATE_COMPLETE',
'_resourceStatusReason': None,
'_resourceType': u'AWS::AutoScaling::AutoScalingGroup',
'_stackId': u'arn:aws:cloudformation:us-east-1:XXXXXXXXXXXXX:stack/AS15/XXXXXXXX-cc30-11e1-XXXXXX-XXXXXXXXXX',
'_stackName': u'AS15'}
Run Code Online (Sandbox Code Playgroud)
如您所见,元数据字段为空,这就是它无法创建堆栈的原因。与 autoscale 一起使用时, cfn-init 是否有任何已知的副作用?
我正在尝试使用 CloudFormation 启动一个 EC2 实例,该实例使用临时/实例存储而不是 EBS。
我已经使用 Opsworks 进行了管理 - 因此在 EC2 管理窗口中,“根设备”不是 ebs。我还没有弄清楚如何使用 CloudFormation 模板来做到这一点。
我有一种感觉,它与 BlockDeviceMappings 有关,但还没有弄清楚。我在这里找到了与我想做的最接近的讨论:https : //forums.aws.amazon.com/message.jspa?messageID=243921
有人可以提供 CloudFormation 模板片段来启动基于临时存储的实例吗?
文档的其他部分似乎有用:
我正在尝试创建一个 AWS CloudFormation 模板,其中包含我要为其选择特定子网的实例。如果我指定子网 ID,则会出现以下错误The parameter groupName cannot be used with the parameter subnet。从阅读此线程看来,我需要提供安全组 ID - 而不是名称。如何在 CloudFormation 中创建安全组,然后在事后获取其 ID?
实例配置的相关部分如下
"WebServerHost": {
"Type" : "AWS::EC2::Instance",
<..skipping metadata...>
"Properties": {
"ImageId" : { "ami-1234" },
"InstanceType" : { "Ref" : "WebServerInstanceType" },
"SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ],
"SubnetId" : "subnet-abcdef123",
Run Code Online (Sandbox Code Playgroud)
安全组如下所示
"WebServerSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable HTTP and SSH",
"SecurityGroupIngress" : [
{"IpProtocol" : "tcp", …Run Code Online (Sandbox Code Playgroud) 到目前为止,我一直在手动启动 EC2 实例,复制下载我的厨师 + 厨师工件的 bash 脚本,并调用chef-solo 来配置实例。
该公司的一位前 AWS 工程师曾创建过 CF 模板;我几乎不知道如何使用。
有没有办法将我的 bash 脚本集成到 CF 模板中,以便在 CF EC2 实例启动时调用我的 bash 脚本并且实例是auto-provisioned?
我们有一个使用 CloudFormation 配置的 AWS Lambda(更广泛的 AWS 堆栈的一部分)。要求我们在此 Lambda 上实施/配置X-Ray。公司政策禁止我们(按角色/按帐户)访问 AWS 控制台,这也是我们使用 CloudFormation 定义 AWS 堆栈的部分原因;但这意味着我们无法通过 AWS 控制台启用 X-Ray(通常是这样做的方法)。
遗憾的是,我们尚未找到有关将 X-Ray 与 CloudFormation 结合使用的文档。回顾CloudFormation 发布历史记录,我们发现 X-Ray 实际上并未列出。CloudFormation 似乎不支持以这种方式使用 X-Ray 配置 Lambda。
我们还发现了名为TracingConfig的东西,它可以通过 CloudFormation 启用。然而,关于它的作用,或者输出是什么样子/它去哪里的文档并不多。我们发现的与此相关的充满希望的信息是关于两者的文档TracingConfig,并X-Ray在传递中提到了他们所谓的“主动跟踪”。
因此,我的问题最终是,我们可以从中获得多少信息TracingConfig,以及如果我们能够使用它,我们能与本来可以提供的信息有多接近X-Ray?
或者
是否有在 CloudFormation 中启用 X-Ray 的未记录方法?
继承了亚马逊托管的基础设施,包括一个负载均衡器、一个数据库服务器和一个自动缩放组内的几个网络服务器;由 CloudFormation 协调部署。
问题是,旋转的网络服务器有一个微不足道的根卷 (8gb),有时在网络服务器生命周期内,磁盘被日志和临时文件填满,一些服务停止工作。
我找到了声明机器定义的部分(我认为):
...
"Properties": {
"ImageId": {
"Fn::FindInMap": [
"AWSRegionArch2AMI",
{
"Ref": "AWS::Region"
},
{
"Fn::FindInMap": [
"AWSInstanceType2Arch",
{
"Ref": "InstanceType"
},
"Arch"
]
}
]
},
"InstanceType": {
"Ref": "InstanceType"
},
"SecurityGroups": [
{
"Ref": "WebServerSecurityGroup"
}
],
"KeyName": {
"Ref": "KeyName"
},
"UserData": {
"Fn::Base64": {
"Fn::Join": [
...
Run Code Online (Sandbox Code Playgroud)
实例类型最终在其他地方定义:
"InstanceType": {
"Description": "WebServer EC2 instance type",
"Type": "String",
"Default": "c4.xlarge",
"AllowedValues": [
"t1.micro",
"t2.nano",
# ... more allowed values
"cg1.4xlarge"
],
"ConstraintDescription": "must …Run Code Online (Sandbox Code Playgroud) 我在 AWS 中有一个 cloudformation 脚本,它创建了一个 EC2 实例,有一些防火墙规则、S3 映射和其他东西。我在 route53 中为实例的公共 ip 创建了一个 DNS 记录,这很好用。
现在我需要在主机的内部 ip 的 DNS 中创建另一条记录(供内部使用,以便其他实例无需通过公共 ip 即可与此实例通信)。
我还没有找到一种方法来做到这一点。是否可以?有没有人有一个示例 cloudformation 脚本?
domain-name-system amazon-web-services amazon-route53 amazon-cloudformation
我们有一个托管在 AWS RDS 上的 PostgreSQL 数据库。当使用cloudformation创建它时,我将其设置为加密,但没有设置加密密钥。因此,它被设置为使用默认加密密钥。
此后我被告知,有一个公司标准,所有 RDS 实例都应该有自己的密钥。
我已经使用 cloudformation 创建了新密钥并将其与 RDS 实例关联,但是当我部署此模板时,它想要删除并重新创建数据库。
我不太熟悉这一切是如何工作的,并且我正在寻找一个不会导致我们丢失数据的程序。如果需要的话,一点停机时间不会对我们造成伤害。
amazon-web-services amazon-rds amazon-cloudformation amazon-kms
我们正在使用云形成为我们的 AWS EC2 实例提供支持。我们有 3 个不同的堆栈 - 测试、暂存和生产。我们更新任何堆栈的图像的工作流程如下:
update堆栈更改我们的 cloud-formation 配置中的 ami 引用(通过 json 文件)。这会关闭堆栈中的实例 + 使用新磁盘映像重新配置它们。
我们的测试或暂存堆栈没有问题,每个堆栈都包含一个 ec2 实例。每次我们更新,图像被替换没有问题。
我们的生产堆栈似乎并没有以相同的方式工作 :-(。它包含(至少)2 个位于负载均衡器后面的实例。当我们以相同的方式更新此堆栈时,ec2 实例不会立即刷新(即更新完成后,这些盒子仍然从以前的磁盘映像运行)。好消息是当负载平衡器自动缩放时会使用新的映像。
负载均衡规则和云形成之间会不会有冲突?
任何见解将不胜感激
例子:
测试栈:https : //gist.github.com/robsquires/629fb6da2d10869363e5
生产堆栈:https : //gist.github.com/robsquires/79de54eeb04d620d5222
amazon-ec2 amazon-web-services amazon-elb amazon-cloudformation
我有一个带有LaunchConfig. 在UserData我需要引用正在创建的实例的公共 IP。我想使用Fn::GetAtt,但它需要逻辑名称,我不确定在使用时如何定义它LaunchConfig。
"LaunchConfig": {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Metadata" : {"..."},
"Properties": {
"ImageId" : "...",
"InstanceType" : { "Ref" : "InstanceType" },
"SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ],
"KeyName" : { "Ref" : "KeyName" },
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"..."
]]}}
}
},
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个 SecurityGroup,它的标签类似于Name: SG-StackName. 此代码在 json 中完美运行:
"Resources": {
"SecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
...
"Tags": [{
"Key": "Name",
"Value": {
"Fn::Join" : [ "", [
"SG-",
{ "Ref" : "AWS::StackName" }
]]
}
}
]
}
},
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试将其转换为 yaml:
Resources:
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
...
Tags:
- Key: Name
- Value: !Join
- ''
- - 'SG-'
- Ref: AWS::StackName
Run Code Online (Sandbox Code Playgroud)
堆栈构建失败并显示错误“在标签属性中找不到密钥”。模板中的错误在哪里?
我正在使用 yaml。所以,我们可以使用:
!GetAtt [ WebServer, AvailabilityZone ]
!GetAtt WebServer.AvailabilityZone
Run Code Online (Sandbox Code Playgroud)
此外,我们可以使用:
!Sub 'sometext-${AWS::StackName}'
Run Code Online (Sandbox Code Playgroud)
如何使用 GetAtt 输出而不是${AWS::StackName},最好使用 的第二种形式GetAtt?我知道如何使用,Join但我想继续使用Sub.
我有一个 AWS Cloudformation,我希望在同一 VPC 下的私有子网上有两个 EC2 实例 A 和 B。
在应用中,我需要A访问B,
如何配置B动态分配的私有IP给A?
我相信我可以使用环境变量(例如,使用aws:elasticbeanstalk:application:environment)配置 A。
问题是我不知道如何获取 B 的 IP。我认为它不能是弹性 IP,因为它是私有的,因此它可能会在部署之间更改。
amazon-ec2 amazon-web-services amazon-cloudformation amazon-vpc elastic-beanstalk
amazon-ec2 ×5
yaml ×2
amazon-elb ×1
amazon-kms ×1
amazon-rds ×1
amazon-vpc ×1
autoscaling ×1
chef-solo ×1
syntax ×1