[アップデート] EC2 Instance Connect Endpoint が CloudFormation で遂に使えるようになりました

2023.08.20

いわさです。

2023 年 6 月に EC2 Instance Connect Endpoint がリリースされました。
プライベートサブネットへのインスタンスへ接続する方法のひとつとして注目を浴びました。

今後 IaC などで既存の環境とセットで自動構築したい場合なども考えられており、まだ CloudFormation に対応する前から次のようにカスタムリソースで構築する記事も登場していました。

そんな EC2 Instance Connect Endpoint、これまではまだ CloudFormation 標準リソースとして使うことが出来なかったのですが先日遂にリリースされました。

幻の EC2 Instance Connect Endpoint

「遂に」と言ったのは、実は EC2 Instance Connect Endpoint が登場して 2 週間後くらいに CloudFormation 公式ドキュメントのリリース履歴で新しいリソースとして追加されていました。
リリース履歴だけではなく、新しい CloudFormation リソース「AWS::EC2::InstanceConnectEndpoint」のリファレンスも追加されていました。

実装が早い!と思いつつ、リファレンスをもとに CloudFormation を早速作成しデプロイしてみたのですが、次のようにAWS::EC2::InstanceConnectEndpointが認識されておらずまだ実際に使うことは出来ない状態でした。

% rain deploy template.yaml hoge0617eic
Enter a value for parameter 'BaseAMI' (default value: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2): 
error creating changeset: Template format error: Unrecognized resource types: [AWS::EC2::InstanceConnectEndpoint]

それから数日ごとにこの作成した CloudFormation をデプロイする日々を過ごしていましたが、6 月下旬には公式ドキュメントからも該当ページが削除されていました。

まぼろし...。

遂に実装されたようなので、使ってみよう

その後も定期的に CloudFormation テンプレートを実行していたのですが、そんな今朝。

% rain deploy ~/work/hoge0617instance/template.yaml hoge0617eic -y
Deploying template 'template.yaml' as stack 'hoge0617eic' in ap-northeast-1.
Stack hoge0617eic: CREATE_COMPLETE
Successfully deployed hoge0617eic

2 ヶ月前にダメ元で作った CloudFormation のテンプレートが突然動いたので「きたか...!!(ガタッ)」という感じです。
ドキュメント履歴 を見てみると、2023 年 8 月 17 日に追加されたようです。

余計な前置きが多めになってしまいましたが、実際に使うことが出来るようになったのでコンポーネントやテンプレートを紹介したいと思います。

AWS::EC2::InstanceConnectEndpoint

今回のアップデートでAWS::EC2::InstanceConnectEndpointが CloudFormation テンプレートのリソースとして使用出来るようになりました。
以下がリファレンスです。

所属するネットワークとセキュリティグループを設定するくらいなのでシンプルですね。
PreserveClientIpを設定することでリソース接続時の IP アドレスを切り替えることが出来ます。

テンプレート例

今回は次の記事を参考に、同じような構成を CloudFormation で構築してみました。

  • インターネットゲートウェイも何もないプライベートサブネットに EC2 インスタンスを構築し
  • 2 つのセキュリティグループを作成、1 つは EC2 にアタッチするためのもので、もう 1 つは EC2 Instance Connect Endpoint で使うもの
  • エンドポイントも CloudFormation で作る

EC2 の AMI は Amazon Linux 2 の最新版を使うようにしています。

template.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Parameters: 
  BaseAMI:
    Type: AWS::SSM::Parameter::Value<String>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources: 
  ################################
  # Network
  ################################
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.100.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default
  PrivateSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select [ 0, "Fn::GetAZs": {Ref: "AWS::Region"}]
      CidrBlock: 10.100.0.0/24
      VpcId: !Ref VPC

  ################################
  # Target Server
  ################################
  WebServer:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t3.small
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 8
            DeleteOnTermination: true
            Encrypted: true
      SubnetId: !Ref PrivateSubnet
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      ImageId: !Ref BaseAMI
  WebServerSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "hoge"
      GroupName: !Sub ${AWS::StackName}-web-sg
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          SourceSecurityGroupId: !Ref EicSecurityGroup

  ################################
  # EC2 Instance Connect Endpoint
  ################################
  EicSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
        GroupDescription: "hoge"
        GroupName: !Sub ${AWS::StackName}-allow-sg
        VpcId: !Ref VPC
  EicEndpoint:
    Type: "AWS::EC2::InstanceConnectEndpoint"
    Properties: 
      ClientToken: hogehoge
      SecurityGroupIds: 
        - !Ref EicSecurityGroup
      SubnetId: !Ref PrivateSubnet

デプロイ後に、今回はマネジメントコンソールから対象 EC2 に接続してみます。
次のようにエンドポイントが選択出来るようになっています。

接続に成功しました。良いですね。

さいごに

本日は EC2 Instance Connect Endpoint が CloudFormation で使えるようになったので使ってみました。

一旦ドキュメントリリースされた後に削除されたり、その背景が気になるところです。不具合とかあったのかな。
遂に使うことが出来るようになりましたので、これからは CloudFormation テンプレートに組み込むことも多くなるかもしれませんね。