之前曾问过类似的问题,但我找不到我的问题的确切答案...
我在UserData
部分中定义了一个需要访问其自己的公共IP的EC2实例:
"MyEC2Instance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"SubnetId": {
"Fn::ImportValue": {
"Fn::Sub": "${NetworkStackName}-SubnetID"
}
},
"ImageId": "ami-xxxx",
"InstanceType": { "Ref": "InstanceTypeParameter" },
"IamInstanceProfile": { "Ref": "MasterInstanceProfile" },
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash -v\n",
" PUBLIC_IP=",
{
"Fn::GetAtt": ["MyEC2Instance", "PublicIp"]
},
" /usr/local/bin/docker-compose -f /docker-compose.yml up -d\n"
]
]
}
}
}
通常可以很容易地通过"Fn::GetAtt": ["MyEC2Instance", "PublicIp"]
访问它,但是在这种情况下,这会引发“循环依赖错误”-确保这样做确实有意义,但是我该如何解决呢?
答案 0 :(得分:6)
公共ip在创建后已分配给EC2实例,因此无法在其用户数据中呈现它。
您可以使用instance metadata获取公共ipv4以及其他实例属性。
PUBLIC_IP=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4)