如何在cloudformation模板中获取docker主机的实例id

如何在cloudformation模板中获取docker主机的实例id

我有一个简单的 CloudFormation 堆栈,它是用模板创建的。一个托管一个 Docker 容器的服务器。

这是创建主机和容器的模板的一部分:

  ContainerHostInstances:
    Type: "AWS::AutoScaling::LaunchConfiguration"
    DependsOn: "AttachGateway"
    Properties:
      AssociatePublicIpAddress: true
      ImageId: "ami-0302f3ec240b9d23c"
      SecurityGroups:
        - Ref: "NginxSecurityGroup"
      InstanceType: "t3.nano"
      IamInstanceProfile: !Ref "ECSHostEC2InstanceProfile"
      KeyName: "test-key-pair"
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          echo ECS_CLUSTER=${MyCluster} >> /etc/ecs/ecs.config
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource ECSAutoScalingGroup --region ${AWS::Region}

...

  MyTask:
    Type: "AWS::ECS::TaskDefinition"
    Properties:
      Family: "my-task-family"
      ContainerDefinitions:
        - Name: "nginx"
          Essential: true
          Image: "image_url/nginx:latest"
          MemoryReservation: 300
          LogConfiguration:
            LogDriver: "awslogs"
            Options:
              awslogs-group: "nginx"
              awslogs-region: !Ref "AWS::Region"
              awslogs-stream-prefix: "prefix"
              awslogs-datetime-format: "%Y-%m-%d %H:%M:%S.%L"
          PortMappings:
            - ContainerPort: 80
              HostPort: 80

我的问题是无法在模板中关联弹性 IP 地址。我可以使用控制台执行此操作,但如果可能的话,我希望将其放在模板内。

我尝试过这个方法:

  ElasticIPAssoc:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId: "some_id"
      InstanceId: "HOW CAN I GET THIS VALUE"
      NetworkInterfaceId: "OR THAT VALUE"

我没有看到获取 instanceId 或其对应的 NetworkInterfaceId 的方法。

答案1

通常你不会给弹性 IP致东道主Auto Scaling 组

其中一些原因是 ASG 可以扩展和收缩,您需要跟踪已分配/空闲的 EIP,在创建新实例时重新分配它们,不断更新 DNS 以仅列出已分配的 EIP 等。这并不切实际。

标准方法是负载均衡器在......面前Auto Scaling 组.最好应用程序负载均衡器(ALB)除非你有特殊要求使用经典/弹性负载均衡器(ELB)或网络负载均衡器(国家图书馆协会)。

ASG 中的实例可以自动注册到 ALB,在 DNS 中,您将拥有 ALB 主机名的 CNAME 等。这是 Auto Scaling Groups 的标准方法。

CFN 模板的另一个选项是创建单个实例Type: AWS::EC2::Instance) 而不是启动配置自动伸缩组。它不会像 ASG 那样为您提供那么多的弹性,但可以让您在模板中分配 EIP 并摆脱 ALB。

希望有帮助:)

答案2

作为甲基路写道,最好切换到没有任何 AutoScaling 组/ASG 的单个 EC2 实例。

如果您在实例状态检查失败时使用 ASG 恢复实例,并且这是默认的 ASG 健康检查行为,您可以尝试EC2 自动恢复功能。您可以创建一个 Amazon CloudWatch 警报来监控实例,并在实例因底层硬件故障或需要 AWS 参与修复的问题而受损时自动恢复实例。换句话说,当其状态检查失败时。这可以在 CloudFormation 模板中轻松声明。

如果您确实需要为 ASG 中的实例分配 EIP,假设这是 ASG 中唯一的实例,那么您可以尝试:

  • 创建一个 IAM 角色,其策略允许将 EIP 与实例关联
  • 通过设置实例配置文件将角色传递给实例
  • 通过从用户数据中调用相应的 API(即使用 AWS CLI 等)将 EIP 与实例关联起来

在 EC2-VPC-only 账户中的 VPC 中,这已经足够了,因为默认情况下允许 EIP 重新关联。否则,您必须在“旧版”EC2-classic 账户中明确允许它。

如果你想让它更成熟,你可以尝试使用AutoScaling 生命周期挂钩。有了它们,您可以在启动时/ASG 扩展但尚未启动时说“将 EIP 与新实例关联” in-service。当即将终止/ASG 在终止之前缩减时,您可以“将 EIP 与实例解除关联”。这将需要 IAM 角色中的额外权限才能允许解除关联的 EIP 地址 API 操作。

相关内容