AWS Cloudformation将一个ec2实例的私有IP地址获取到另一个ec2实例

时间:2018-07-24 13:13:28

标签: amazon-web-services amazon-ec2 yaml amazon-cloudformation

我使用YAML模板在AWS CloudFormation中创建了两个Amazon EC2实例。我想将一个EC2实例的私有IP地址带到另一个具有公共IP地址的EC2实例。根据AWS文档,我们可以使用!GetAtt JMeterServer1Instance.PrivateIp

  1. 我想知道应该在公共EC2实例的哪个部分添加该内容。 (请考虑这是一个YAML模板。)
  2. 如何检查我们是否收到了邮件?

4 个答案:

答案 0 :(得分:2)

您的要求似乎是:

  • 在CloudFormation模板中创建两个实例
  • 在实例A的用户数据中,请参阅实例B

这很简单。首先,定义实例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)

按照AWS document

  

Fn :: GetAtt

将在此处完成操作。

我的情况是:

  1. 需要首先创建EC2Instance001
  2. EC2Instance002需要使用EC2Instance001的IP。

在EC2Instance002上,实例具有两个特定设置:

  • “ DependsOn”:[“ EC2Instance001”],因为我希望先创建EC2Instance001。
  • 在Userdata(或元数据)下,使用{“ Fn :: GetAtt”:[“ EC2Instance001”,“ PrivateIp”]}获取第一个实例(EC2Instance001)的IP

这是我实现它的方式(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