VPCエンドポイントをCloudFormationで一括作成：SSM・SSMMessages・EC2Messages対応テンプレート

## はじめに

本記事では、AWS CloudFormation を用いて、Session Manager 利用に必要な VPC エンドポイント（Interface型）を一括で作成するテンプレートを試してみた記録をまとめます。対象は以下の3つのサービスです：

* SSM
* SSMMessages
* EC2Messages

これらを一つのサブネットに対してまとめて構築できるテンプレートを作成してみました...！

## 書こうと思ったきっかけ

普段、Session Manager を使って EC2 に接続する際、VPCエンドポイント（特にインターフェース型）を手動で構築していました。

:::note warn
**ただ、構成管理や再現性の観点から、毎回マネコンで作るのは非効率だと感じており、CloudFormation テンプレートで一元管理した方が便利だと思いました。**
:::

また、Session Manager を使って EC2 に接続する記事は以下の記事で詳細にまとめているので、興味のある方は参考にしてみてください。

https://qiita.com/free-honda/items/9740ef602f072ab2b88c

そこで、Session Manager に必要な3種のエンドポイントをまとめて作成できるテンプレートを用意し、実際に動かしてみることにしました。

## 実際にやってみた

以下のテンプレートを使用して、CloudFormation スタックを作成しました。

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Create SSM-related Interface VPC Endpoints with one subnet

Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VPC ID

  InterfaceSubnetId:
    Type: AWS::EC2::Subnet::Id
    Description: Interface Subnet ID (1つだけ)

  InterfaceSecurityGroupId:
    Type: AWS::EC2::SecurityGroup::Id
    Description: Interface型エンドポイント用のセキュリティグループID

Resources:

  # SSM Endpoint
  ssmEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssm"
      SubnetIds:
        - !Ref InterfaceSubnetId
      VpcId: !Ref VpcId
      VpcEndpointType: Interface
      SecurityGroupIds:
        - !Ref InterfaceSecurityGroupId
      PrivateDnsEnabled: true

  # SSM Messages Endpoint
  ssmMessagesEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssmmessages"
      SubnetIds:
        - !Ref InterfaceSubnetId
      VpcId: !Ref VpcId
      VpcEndpointType: Interface
      SecurityGroupIds:
        - !Ref InterfaceSecurityGroupId
      PrivateDnsEnabled: true

  # EC2 Messages Endpoint
  ec2MessagesEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ec2messages"
      SubnetIds:
        - !Ref InterfaceSubnetId
      VpcId: !Ref VpcId
      VpcEndpointType: Interface
      SecurityGroupIds:
        - !Ref InterfaceSecurityGroupId
      PrivateDnsEnabled: true
```

### 実行手順

- AWS マネジメントコンソールまたは AWS CLI からスタックを作成

![Screenshot 2025-06-15 at 15.54.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/5f71a1ed-36e4-49b8-9fe5-e47adf637d26.png)

- パラメータに `VpcId`、`InterfaceSubnetId`、`InterfaceSecurityGroupId` を入力

![Screenshot 2025-06-15 at 15.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4cf3a858-e0dd-46fd-91d7-bdc9e32dc2d0.png)

- 数分で 3つのインターフェース型エンドポイントが自動作成されていることが確認できました

![Screenshot 2025-06-15 at 15.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/72b0e890-dc80-4de7-977e-1fcf90400a51.png)


- VPC 内の EC2 から Session Manager による接続が即可能な状態に！

![Screenshot 2025-06-15 at 15.58.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c197e0bf-0887-4184-98f2-957e184aece5.png)

**こんな感じでアクセスできました！**

![Screenshot 2025-06-15 at 16.50.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/77237c6a-a7c6-4b6b-b4d8-8b79d7ae068c.png)

特に問題なく一括作成でき、CloudFormation での一元管理の利便性を実感しました...！

## まとめ

Session Manager を使う上で必須となる3つの VPC エンドポイントを CloudFormation でまとめて構築するテンプレートを使ってみました。

:::note info
**手動での作業を減らし、再現性やチーム開発での共有も簡単になるので、今後はこのテンプレートをベースに活用して行けたらいいなぁと考えています！**
:::

今後は、複数サブネット対応版や、他のサービス向けエンドポイントのテンプレート化も検討していきます...！

## 参考文献

https://dev.classmethod.jp/articles/interface-vpc-endpoint-cloudformation/

https://zenn.dev/iossu7/articles/86af3b0bd0f6c8

https://blog.serverworks.co.jp/aws-systems-manager-endpoint