我们有一个用于创建一些 EC2 实例的 AWS CloudFormation 模板。然而,其中一些需要特定的PrivateIpAddress,我正在努力弄清楚如何将其合并到模板中。
现在我有一个模板参数PrivateIP和一个创建条件RequestedPrivateIP。到现在为止还挺好。但是我不知道如何将它合并到AWS::EC2::Instance资源规范中。我试过这个:
"PrivateIpAddress": {
"Fn::If": [ "RequestedPrivateIP",
{ "Ref": "PrivateIP" },
"" <-- This doesn't work
]
},
Run Code Online (Sandbox Code Playgroud)
但是当RequestedPrivateIP是 false时失败了
CREATE_FAILED AWS::EC2::Instance NodeInstance Invalid addresses: []
Run Code Online (Sandbox Code Playgroud)
知道如何有选择地分配静态私有 IP,如果未指定,则将其留给 AWS 来设置动态私有 IP?
我现在正在试验 CloudFormation。我部署了一个堆栈,其中包括一个 AutoScalingGroup(以及 LaunchConfig 和 CloudFormation::Init)、LoadBalancer、一个 EC2 实例(和 CloudFormation::Init)和几个安全组。
如果我终止由 AutoScalingGroup 创建的 EC2 实例,它们会按预期重新创建。这对于测试我的 LaunchConfiguration 和 CloudFormation::Init 设置的更改实际上非常有用(基本上确保它从头开始工作)。
我还有一个DnsServer1具有公共 IP的 EC2 实例(名为)。在处理它的 CloudFormation::Init 数据时,我还手动终止了它的实例。我知道 CloudFormation 不会像 AutoScalingGroup 那样恢复它,但我希望在我运行aws cloudformation update-stack.
相反,我收到错误:AWS::EC2::Instance DnsServer1 i-014eee8720c4fb542 does not exist。
完整更新日志:
11:03:40 UTC-0500 UPDATE_ROLLBACK_COMPLETE AWS::CloudFormation::Stack GregCFTest1
11:03:38 UTC-0500 UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS AWS::CloudFormation::Stack GregCFTest1
11:03:36 UTC-0500 UPDATE_COMPLETE AWS::AutoScaling::LaunchConfiguration WebServerLaunchConfig
11:03:36 UTC-0500 UPDATE_COMPLETE AWS::EC2::Instance DnsServer1
11:03:13 UTC-0500 UPDATE_ROLLBACK_IN_PROGRESS AWS::CloudFormation::Stack GregCFTest1 The following resource(s) failed to update: [DnsServer1].
11:03:11 UTC-0500 UPDATE_COMPLETE AWS::AutoScaling::LaunchConfiguration WebServerLaunchConfig …Run Code Online (Sandbox Code Playgroud) 我正在使用 CloudFormation 将 ELB 部署到具有预先存在的子网的预先存在的 VPC。我已经在模板的 Mappings 部分列出了子网,并根据 Environment 参数选择了映射。如果 Mapping 用于单个值,这可以正常工作,但我希望 Mapping 返回一个列表,因为我希望 ELB 是多可用区。我已经尝试了下面示例的各种组合,但我总是得到相同的错误Value of property Subnets must be of type List of String。FindInMap 有没有办法返回值列表?
ELB 配置示例
"ElasticLoadBalancerAPI": {
"Properties": {
"ConnectionDrainingPolicy": {
"Enabled": true,
"Timeout": 30
},
"ConnectionSettings": {
"IdleTimeout": 60
},
"CrossZone": "false",
"Subnets" : [
{
"Fn::FindInMap": [
"AWSEnv2PublicSubnets",
{
"Ref": "Env"
},
"subList"
]
}
],
"SecurityGroups" : [ { "Ref" : "LoadBalancerSecurityGroup" }],
etc...
Run Code Online (Sandbox Code Playgroud)
示例参数
"Parameters": {
"Env": {
"Description": "Environment", …Run Code Online (Sandbox Code Playgroud) 目前我有一个共享的 S3 存储桶,它具有对不同实例的特定关键路径(即文件夹)的特定访问权限。我已经能够使用我的新角色创建实例配置文件并测试限制访问该文件夹没有问题。
我的问题是,存在具有定义策略的现有通用角色,我还希望能够将其包含在每个堆栈的新角色中。
在 cloudformation 中,是否可以将在一个角色中定义的策略包含在另一个角色中,而无需在新角色中重新定义策略文档?
类似于以下内容:
"AppTierS3AccessRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [ "ec2.amazonaws.com" ]
},
"Action": [ "sts:AssumeRole" ]
}
]
},
"Path": "/",
"Policies": [ { "Ref": "existing-policy" } ]
}
},
Run Code Online (Sandbox Code Playgroud)
“现有政策”是这里的重要组成部分。我试图找到现有政策的 arn 来尝试参考它,但我有点卡住了。
我似乎无法找到任何关于手动处理 Cloudformation 对象时会发生什么的文档。
我看到它标记了它的对象,但是如果有人删除路由规则,它会恢复吗?
编辑:刚刚得到两个相互矛盾的答案。我想请求一些文件/证据,因为我必须决定我给我的同事关于修改这些资源的指示。
我想使用作为 CloudFormation 一部分创建的密钥对启动我的堆栈。
那可能吗?
....
"Resources": {
"ReverseProxyKeyPair": {
"Type": "AWS::EC2::KeyPair",
"Properties": {
"KeyName": "reverse_proxy"
}
},
....
Run Code Online (Sandbox Code Playgroud)
是一个猜测,但没有奏效。我还没有找到 CloudFormation 的架构来说明这是不可能的。
大多数示例都假设已经创建了 KeyPair - 我假设是因为在创建时只有一次下载它的机会。但我想动态创建一个,然后将其用作输出并将其转储到 S3 中(比如说)。
或者,这是一个愚蠢的想法吗?
我有一个手动创建的安全组来访问Redis,我正在使用AWS CloudFormation创建一个 LAMP 堆栈。我需要从 Redis更新Amazon EC2安全组以允许从此 LAMP 堆栈进行访问,但我希望它通过 CloudFormation 进行更新 - 这可能吗?
我对我的 cloudformation 模板进行了更改,只是在 AWS::AutoScaling::LaunchConfiguration 中添加了映射和用户数据,现在它无法创建我的堆栈并显示消息“无法描述 AMI”。
知道为什么吗?谷歌确实在这里带来了很多帮助。
我现在设置了一个可扩展的负载均衡器,主要遵循这个模板:
https://github.com/satterly/AWSCloudFormation-samples/blob/master/LAMP_Multi_AZ.template
将AWS::AutoScaling::AutoScalingGroup.CreationPolicy.ResourceSignal.Count键调整为0(基本上允许在未收到成功信号的情况下加载堆栈)后,我能够加载堆栈,并且可以看到所有可用资源。
我可以看到正在创建的密钥的公共 DNS,但我无法通过 SSH 连接到实例。
我对实例规则中的每个人都有开放的 SSH 访问权限,我可以在 AWS 控制台中确认这一点。
我还按照官方 AWS 文档中的建议为我的 VPC 配置了一条路由:https : //aws.amazon.com/premiumsupport/knowledge-center/ec2-linux-ssh-troubleshooting/
我可以看到实例存在,但似乎我限制了自己在某处的访问。但是,在 AWS EC2 控制台中,设置看起来与我能够通过 SSH 连接到实例时相同。
这是我正在使用的 JSON 模板,您可以在其中查看我的所有设置,包括我的 VPC、子网、安全组等:https : //gist.github.com/dambrogia/e4cd93a64ae6f3a79d4a58d466f144f8
我从以下命令收到超时错误:(我的id_rsa密钥在 ec2 内有效)
ssh -i ~/.ssh/id_rsa ec2-user@<ec2_instance>
Run Code Online (Sandbox Code Playgroud)
load-balancing amazon-ec2 amazon-web-services amazon-cloudformation
如何将文件上传到我的 AWS S3 存储桶 CloudFormation 模板?
AWSTemplateFormatVersion: '2010-09-09'
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
AccessControl: PublicRead
BucketName: s3bucketuser
VersioningConfiguration:
Status: Enabled
Run Code Online (Sandbox Code Playgroud)