我使用YAML模板在AWS CloudFormation中创建了两个Amazon EC2实例。我想将一个EC2实例的私有IP地址带到另一个具有公共IP地址的EC2实例。根据AWS文档,我们可以使用!GetAtt JMeterServer1Instance.PrivateIp
答案 0 :(得分:2)
您的要求似乎是:
这很简单。首先,定义实例B DependsOn
实例A,以确保在实例B之前创建实例A。
然后,在实例B的用户数据中,参考实例A:
UserData:
"Fn::Base64":
!Sub |
#!/bin/bash
echo "${InstanceA.PrivateIp}" >foo
“更好”的方法是将DNS名称与 Route 53中VPC的托管区域一起使用。这将为VPC创建一个DNS区域,然后定义一个可以在本地解析的DNS名称。将其链接到实例B,然后实例A可以通过DNS名称而不是IP地址来引用实例B。如果需要,这可以使DNS名称将来指向另一个实例,并在实例A和实例B之间创建更少的依赖性。 (但是,坦率地说,还有更多设置。)
答案 1 :(得分:0)
这取决于您对另一台计算机上的私有IP的要求。 如果要在其他VM的脚本中使用它,请像下面的示例一样在用户数据脚本中传递它:UserData script with Resource Attribute CloudFormation
链接上的示例显示的是NetworkInterface
的属性,而不是实例属性,但是与!GetAtt JMeterServer1Instance.PrivateIp
相同。
答案 2 :(得分:0)
Fn :: GetAtt
将在此处完成操作。
我的情况是:
在EC2Instance002上,实例具有两个特定设置:
这是我实现它的方式(EC2Instance002):
---
EC2Instance002:
Type: AWS::EC2::Instance
Metadata:
AWS::CloudFormation::Init:
configSets:
InstallAndRun:
- Install
- Configure
Install:
packages:
yum:
git: []
files:
"/tmp/bootstrap.sh":
content:
Fn::Join:
- ''
- - "#!/bin/bash\n"
- 'set -x
'
- 'echo "============================"
'
- 'sudo hostname >> /tmp/EC2Instance.txt
'
- MASTERIP=
- Fn::GetAtt:
- EC2Instance001
- PrivateIp
- "\n"
- "echo $MASTERIP > masterIP.txt \n"
mode: '755'
owner: ec2-user
group: ec2-user
Configure:
commands:
runBootstrapScript:
command: "./bootstrap.sh"
cwd: "/tmp"
DependsOn:
- EC2Instance001
Properties:
InstanceType:
Ref: InstanceType
SecurityGroups:
- Ref: InstanceSecurityGroup
KeyName:
Ref: KeyName
UserData:
Fn::Base64:
Fn::Join:
- ''
- - "#!/bin/bash -xe\n"
- 'yum install -y aws-cfn-bootstrap
'
- "# Install the files and packages from the metadata\n"
- "/opt/aws/bin/cfn-init -v"
- " --stack "
- Ref: AWS::StackName
- " --resource EC2Instance002 "
- " --configsets InstallAndRun "
- " --region "
- Ref: AWS::Region
- "\n"
ImageId:
Fn::FindInMap:
- AWSRegionArch2AMI
- Ref: AWS::Region
- Fn::FindInMap:
- AWSInstanceType2Arch
- Ref: InstanceType
- Arch
您可以看到在元数据下,我正在变量 $ MASTERIP 中捕获 EC2Instance001 实例的IP。
注意: JSON中的同一行将写为:
"MASTERIP=",{ "Fn::GetAtt" : [ "EC2Instance001", "PrivateIp" ] }, "\n",
答案 3 :(得分:-1)
如果使用UserData
类型,请查看AWS::EC2::Instance
。更多CFN EC2 UserData
示例模板
Type: "AWS::EC2::Instance"
Properties:
ImageId: <ami>
InstanceType: "t2.micro"
KeyName: <keyname>
UserData:
"Fn::Base64":
!Sub |
#!/bin/bash
yum install httpd php mysql php-mysql -y
yum update -y
chkconfig httpd on
service httpd start