皆様、お世話になっております。鈴木と申します。
今回はAWS CloudFormationを使用してSSMエンドポイントを作成していきたいと思います。
1.目次
2.要件
-SSMエンドポイントを経由したEC2との通信をHTTPSで行う
3.AWS Systems Manager
3-1.AWS Systems Managerについて
AWS Systems Manager (SSM) は、AWS クラウド環境内でのリソース管理や運用を簡素化するためのサービスです。主に以下の機能を提供します。
- インスタンス管理: EC2 インスタンスの操作や管理を中央から実行できます。
- パッチ管理: オペレーティングシステムやアプリケーションのパッチを自動的に適用し、セキュリティやバグ修正を迅速に行います。
- 構成管理: インスタンスやリソースの設定を標準化し、一貫した環境を維持します。
- システム状態の監視: リソースの状態を監視し、異常があればアラートを送信します。
SSM を利用することで、クラウド環境の運用がより効率的かつ安全になります。
3-2.SSM エンドポイントについて
SSM エンドポイント は、AWS Systems Manager サービスにアクセスするための専用のネットワーク接続ポイントです。以下の2つの主なタイプがあります。
- インターフェース型エンドポイント
役割: AWS Systems Manager やその他の AWS サービスに対して、プライベートなネットワーク経由でアクセスを提供します。
特徴: インターネットを経由せず、VPC 内で安全に通信が行えます。これにより、セキュリティが向上し、通信のパフォーマンスも向上します。 - ゲートウェイ型エンドポイント
役割: 主に Amazon S3 や DynamoDB など、特定の AWS サービスに対して使用されます。
特徴: VPC 内のリソースが、インターネットを介さずに直接 AWS サービスにアクセスできます。
SSM へのセキュアなアクセスを提供するためのネットワーク接続ポイントで、プライベートネットワーク経由での通信を実現できます。
4.構成図
下記の構成図のように、HTTPSでの通信を行うためにSSMエンドポイントを経由してEC2を操作します。
5.ソースコード
YAML形式にて記述しております。
下記ソースコードにてエンドポイントを作成しております。
本来であればタグをつけたいのですが、エラーが出て付けられないためタグは後ほど手動で入れます。
※おそらくCloudFormationがまだ対応していないと思われます。
SSMとEC2で疎通を取るためには下記サービスを付与する必要があります。
- com.amazonaws.ap-northeast-2.ssm
- com.amazonaws.ap-northeast-2.ssmmessages
- com.amazonaws.ap-northeast-2.ec2messages
AWSTemplateFormatVersion: '2010-09-09'
Description: Create VPC Endpoints for SSM, SSMMessages, and EC2Messages in two subnets
Resources:
# Create SSM Endpoint
SSMEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssm"
SubnetIds:
- !Ref Subnet1Id
- !Ref Subnet2Id
VpcId: !Ref VpcId
VpcEndpointType: Interface
SecurityGroupIds:
- !Ref SecurityGroupId
PrivateDnsEnabled: true
# Create EC2Message Endpoint
EC2MessageEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub "com.amazonaws.${AWS::Region}.ec2messages"
SubnetIds:
- !Ref Subnet1Id
- !Ref Subnet2Id
VpcId: !Ref VpcId
VpcEndpointType: Interface
SecurityGroupIds:
- !Ref SecurityGroupId
PrivateDnsEnabled: true
# Create SSMMessages Endpoint
SSMMessagesEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssmmessages"
SubnetIds:
- !Ref Subnet1Id
- !Ref Subnet2Id
VpcId: !Ref VpcId
VpcEndpointType: Interface
SecurityGroupIds:
- !Ref SecurityGroupId
PrivateDnsEnabled: true
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::VPCEndpoint | VPCエンドポイントを定義 |
ServiceName | 各サービスを付与 | サービス名 |
SubnetIds | パラメータのサブネットを指定 | 配置先のサブネットを指定 |
VpcIde | パラメータのVPCを指定 | 配置先のVPCを指定 |
VpcEndpointType | Interface | InterfaceかGateway SSM↔EC2ではInterface |
SecurityGroupIds | パラメータのセキュリティグループを指定 | 付与するセキュリティグループを指定 |
PrivateDnsEnabled | true | DNS名前解決を有効化 |
6.疎通確認
6-1.定義
実際にプライベートサブネットにEC2とSSMエンドポイントを設定し、疎通確認を行います。
セキュリティグループとIAMロールは事前に準備済みで内容は下記です。
セキュリティグループ
- EC2
HTTPS(443)を許可してソースをSSMのセキュリティグループを指定 - SSM
HTTPS(443)を許可してソースをEC2のセキュリティグループを指定
IAMロール
- EC2にアタッチ
AmazonSSMManagedInstanceCore
6-2.EC2を起動
すでにSSMエンドポイントは上記ソースコードにて作成済みなので、Ec2を設定していきます。
上記セキュリティグループとIAMロールを付与します。
下記でパブリックIPが付与されていないことを確認できます。
「接続」→「セッションマネージャー」から接続できることが確認できます。
実際にターミナルでの操作も確認できました。
7.感想
事前にVPCを作成している場合に、CloudFormationを使ってSSMエンドポイントを構築する際、パラメータを指定しないと設定できないことがわかり、少し手間取ってしまいました。エンドポイントにタグを付ける方法が見つからなかった点については、今後の課題として模索していきたいと思います。