【问题标题】:Aws cloudformation get private IP address of one ec2 instance to another ec2 instanceAws cloudformation 将一个 ec2 实例的私有 IP 地址获取到另一个 ec2 实例
【发布时间】:2019-01-01 03:09:03
【问题描述】:

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

  1. 我想知道我应该在模板中添加公共 EC2 实例的哪个部分。 (请认为这是一个 YAML 模板。)
  2. 如何检查我们是否已收到?

【问题讨论】:

  • “将一个 EC2 实例的私有 IP 地址转移到另一个 EC2 实例”是什么意思?您的意思是希望能够在 Instance-B 的 User Data 部分中引用 Instance-A 的 IP 地址吗?
  • 假设我有 2 个 ec2 实例,分别是使用 aws yaml 云形成模板创建的 A 和 B。 A 有一个私有 ip,B 有一个公共 ip。我在实例 A 上运行了一些性能测试。然后我想与实例 B 通信,并将实例 A 上可用的结果传递给实例 B。要满足这样的要求,我需要以某种方式将实例 A 的 IP 地址带到实例 B 的用户数据部分

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


【解决方案1】:

根据AWS document

Fn::GetAtt

将在这里解决问题。

我的情况是:

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

在 EC2Instance002 实例是使用两个特定设置创建的:

  • "DependsOn": ["EC2Instance001"] 因为我希望首先创建 EC2Instance001。
  • 在用户数据(或元数据)下,使用 { "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",

【讨论】:

    【解决方案2】:

    看来您的要求是:

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

    这很简单。首先定义Instance-BDependsOnInstance-A,保证Instance-A的创建在Instance-B之前。

    然后,在Instance-B的用户数据中,参考Instance-A:

      UserData:
        "Fn::Base64":
          !Sub |
            #!/bin/bash
            echo "${InstanceA.PrivateIp}" >foo
    

    “更好”的方法是使用带有 Route 53 中 VPC 托管区域的 DNS 名称。这将为 VPC 创建一个 DNS 区域,然后定义一个可以在本地解析的 DNS 名称。将其链接到 Instance-B,然后 Instance-A 可以通过 DNS 名称而不是 IP 地址来引用 Instance-B。如果需要,这允许 DNS 名称在将来指向不同的实例,并在 Instance-A 和 Instance-B 之间创建较少的依赖关系。 (但是,诚然,更多的设置。)

    【讨论】:

    • 这正是我想要的。非常感谢.. :)
    【解决方案3】:

    这取决于您想在另一台机器上使用私有 IP 做什么。 如果您想在另一个 VM 上的脚本中使用它,请将其传递到用户数据脚本中,如下例所示:UserData script with Resource Attribute CloudFormation

    链接上的示例显示的是NetworkInterface 的属性而不是实例属性,但与!GetAtt JMeterServer1Instance.PrivateIp 相同

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多