如何使用 CloudFormation 设置 EC2 实例连接?

Posted

技术标签:

【中文标题】如何使用 CloudFormation 设置 EC2 实例连接?【英文标题】:How do I setup EC2 instance Connect using CloudFormation? 【发布时间】:2021-12-16 02:44:06 【问题描述】:

我正在尝试为 EC2 实例设置 EC2 Instance Connect:

AWSTemplateFormatVersion: 2010-09-09
Description: Part 1 - Spawn Ec2 instance with CloudFormation

Resources:
  WebAppInstance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: us-east-2a
      ImageId: ami-074cce78125f09d61
      InstanceType: t2.micro

虽然上面的模板允许我创建一个 EC2 实例,但它不允许我使用 EC2 Instance Connect 访问它。

如何在 CloudFormation 模板中配置 EC2 Instance Connect?

解决方案

AWSTemplateFormatVersion: 2010-09-09
Description: Part 1 - Build a webapp stack with CloudFormation

Resources:
  WebAppInstance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: us-east-2a
      ImageId: ami-074cce78125f09d61
      InstanceType: t2.micro
      SecurityGroupIds:
        - !Ref WebAppSecurityGroup

  WebAppSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Join ["-", [webapp-security-group, dev]]
      GroupDescription: "Allow HTTP/HTTPS and SSH inbound and outbound traffic"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0

  WebAppEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
      InstanceId: !Ref WebAppInstance
      Tags:
        - Key: Name
          Value: !Join ["-", [webapp-eip, dev]]

Outputs:
  WebsiteURL:
    Value: !Sub http://$WebAppEIP
    Description: WebApp URL

【问题讨论】:

阻止用户通过 IAM 创建 SSH 密钥 @ErmiyaEskandary 这不是我要解决的问题。我使用上面的模板创建的实例确实创建了一个 EC2 实例,但它不允许我使用 EC2 Instance connect 连接到它。 嗯,好的 - 编辑您的问题,因为看起来您正在尝试强制执行 EC2 实例连接(“获得 ssh 访问机器的唯一可能方法应该是通过 EC2 实例连接” ) 除了 Marcin 的回答之外,您是否尝试通过 UI 进行连接?如果是这样,您的 EC2 实例必须具有公有 IPv4 地址。是吗? 设置公网ip解决了问题 【参考方案1】:

Amazon Linux 2 (any version)Ubuntu 16.04 or later 上,EC2 实例连接为installed and working默认情况下。所以你不需要做任何事情。

对于其他 AMI,您必须使用 user_data 到 install and setup 自己连接。

【讨论】:

我试过了,但我被重定向到出现错误的屏幕,显示“我们无法连接到您的实例。请确保您的实例的网络设置已针对 EC2 Instance Connect 正确配置。对于更多信息,请参阅任务 1:配置对实例的网络访问。" @Salam 如果您的安全组或 VPC 设置不正确,实例连接将无法工作。 使用公共 ip4 地址设置网络安全组就可以了。 @Salam 很高兴它成功了。如果任何答案有帮助,接受其中一个是一种很好的做法。【参考方案2】:

确保您已分配公共 IP。

根据docs:

要使用 Amazon EC2 控制台(基于浏览器的客户端)进行连接,实例必须具有公有 IPv4 地址。**


你也可以 如果您不想/不能分配公共 IPv4 地址,请通过其他方法连接到 EC2 实例:

如果实例没有公共 IP 地址,您可以使用 SSH 客户端或 EC2 Instance Connect CLI 通过私有网络连接到实例。例如,您可以从同一 VPC 内或通过 *** 连接、中转网关或 AWS Direct Connect 进行连接。


仅供参考:对于具有除 Amazon Linux 2 或 Ubuntu 16.04+ 以外的 Linux 发行版的其他 AMI,您将需要额外的配置,正如 Marcin 的回答所指出的那样。

us-east-2 中的ami-074cce78125f09d61 对我来说是 Amazon Linux 2 AMI (HVM), SSD Volume Type,它默认支持 EC2 实例连接,所以你的 AMI 应该没问题。

【讨论】:

以上是关于如何使用 CloudFormation 设置 EC2 实例连接?的主要内容,如果未能解决你的问题,请参考以下文章

EC2 终止时启动 CloudFormation 创建堆栈

如何修复与 AWS::CloudFormation::Init 一起创建 EC2 的 cloudformation 模板

如何使用 CloudFormation 在现有 EC2 实例上启动容器?

如何使用 CloudFormation 将安全组添加到现有 EC2 实例

如何使用cloudformation模板将两个EC2实例(安装AMI创建的Elasticsearch)作为多节点?

如何在 cloudformation 中获取 Elastic Beanstalk EC2 实例的 instanceId?