[アップデート] EC2 Instance Connect Endpoint が CloudFormation で遂に使えるようになりました
いわさです。
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 の最新版を使うようにしています。
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 テンプレートに組み込むことも多くなるかもしれませんね。