はじめに
「EC2からCloudWatch Logsへのログ連携の確認がしたいな」と思っても、常時接続環境がないためネットワークやエージェントの設定からやり直すことになり、大幅なタイムロスを生んだ経験があります。
こうした無駄を省きつつコストも抑えるために、最初はCloudFormationを使ってEC2とSSM用のVPCエンドポイントをIaC化する手法を検討しました。
しかし、検討を進めていくなかで、Service Catalogの活用が有効だと感じ、実際にEC2とSSM用のVPCエンドポイントのデプロイを試してみました。
本記事では、実体験から見えたService Catalogの利点から、EC2とVPCエンドポイントを素早く展開する手順までを詳しく紹介します。
環境構築にかかる時間を短縮し、日々の運用負担を軽くするためのアプローチとしてぜひ参考にしてください。
なぜService Catalogなのか?
CloudFormationを見送った理由
環境の自動構築といえばCloudFormationですが、今回は以下の理由から採用を見送りました。
・StackSetsの制限:各アカウント・1リージョンにつき、EC2インスタンスが1つしか作成できない。
・Stackの運用課題:複数のインスタンスは作成できるが、毎回テンプレートを選択する手間がかかり、バージョンの不整合が発生しやすい。
Service Catalogを採用した決め手
CloudFormationの課題をきれいに解決してくれたのがService Catalogです。
以下のメリットから、1つのアカウント内で複数のEC2インスタンスを展開可能で、バージョン管理ができるService Catalogの方が適していると判断しました。
・柔軟性:各アカウントで複数のEC2インスタンスを作成可能。
・管理のしやすさ:テンプレートをカタログ化することで、手軽さを保ちつつ安全なバージョン管理が実現できる。
手順
手順の流れ
今回の手順の流れは以下になります。
- 既存EC2インスタンスへのインストールおよび設定ファイルの更新
- カスタムAMIの作成
- CloudFormationテンプレートの作成
- Service Catalogでリソースを作成
・カスタムAMIからEC2作成
・VPCエンドポイントの作成
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ssmmessages - セッションマネージャーによるログイン確認
イメージ図
本手順のイメージ図は以下になります。
今回のService Catalogでは、CloudFormationテンプレートを用いるため、CloudFormation経由でリソースが作成されます。
既存EC2インスタンスへのインストールおよび設定ファイルの更新
既存のEC2に必要なエージェントやミドルウェアのインストールおよび設定ファイルを更新します。
今回は個人的に検証で利用する可能性が高い、以下のインストールと設定を行ったAmazon Linux 2023のEC2を用意しました。
・rsyslog
・CloudWatchエージェント
・Kinesisエージェント
・Fluent Bitエージェント
・logrotate関連ファイルの更新
ポイント
Amazon LinuxではSSMエージェントが標準でインストールされていますが、それ以外のOSではセッションマネージャーでログインするためにSSMエージェントをインストールする必要があります。
また、rsyslogはAmazon Linux 2までは標準でインストールされていましたが、Amazon Linux 2023以降は追加でインストールする必要があります。
カスタムAMIの作成
必要なインストールや設定を実施したEC2からCloudFormationテンプレートで使用するカスタムAMIを作成します。
1.対象のEC2インスタンスを停止状態にする
2.対象のEC2を選択し、アクションを押下し、イメージとテンプレートからイメージを作成を押下する
3.以下の項目を設定し、イメージを作成を押下する
・イメージ名:amzn2023-v1.0
・インスタンスを再起動:チェックしない
今回は停止しているため、チェックは不要です
・終了時に削除:チェックする
チェックを入れると、EC2インスタンス停止時にアタッチされているEBSが自動で削除されます
・タグ – オプション:イメージとスナップショットに対し一緒にタグを付けます
4.サイドメニューからAMIを選択し、作成したAMIのステータスが利用可能になっていることを確認する
CloudFormationテンプレートの作成
CloudFormationテンプレートからService Catalogを作成します。
今回、カスタムAMIからEC2とセッションマネージャーで使用する2つのVPCエンドポイントを作成するCloudFormationテンプレートを用意しました。
ParametersのCustomAmiIdで、前手順で作成したカスタムAMIのIDを指定します。
AWSTemplateFormatVersion: '2010-09-09'
Description: 'CloudFormation template to launch an EC2 instance from a Custom AMI with SSM support'
Parameters:
CustomAmiId:
Type: AWS::EC2::Image::Id
Default: ami-xxxxxxxxxxxxxxxxx
Description: 'The ID of the custom AMI'
InstanceType:
Type: String
Default: t3.micro
AllowedValues:
- t2.micro
- t3.micro
- t3.small
- t3.medium
Description: 'EC2 instance type'
SubnetId:
Type: String
Default: subnet-xxxxxxxxxxxxxxxxx
Description: 'The ID of the subnet where the instance will be launched'
EC2SecurityGroupId:
Type: String
Default: sg-xxxxxxxxxxxxxxxxx
Description: 'The ID of the security group to attach to the EC2 instance'
IamInstanceProfile:
Type: String
Default: EC2TestRole
Description: 'The name or ARN of the existing IAM instance profile'
VpcId:
Type: String
Default: vpc-xxxxxxxxxxxxxxxxx
Description: 'Specifies the VPC in which the VPC endpoint will be created.'
EndpointSecurityGroupId:
Type: String
Default: sg-xxxxxxxxxxxxxxxxx
Description: 'Specifies the Security Group for the VPC endpoint.'
CreateVpcEndpoints:
Type: String
Default: 'true'
AllowedValues:
- 'true'
- 'false'
Description: 'Set to false if SSM VPC Endpoints already exist in the target VPC.'
Conditions:
ShouldCreateEndpoints: !Equals [!Ref CreateVpcEndpoints, 'true']
Resources:
CustomAmiInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref CustomAmiId
InstanceType: !Ref InstanceType
SubnetId: !Ref SubnetId
IamInstanceProfile: !Ref IamInstanceProfile
SecurityGroupIds:
- !Ref EC2SecurityGroupId
SsmInterfaceEndpoint:
Type: AWS::EC2::VPCEndpoint
Condition: ShouldCreateEndpoints
Properties:
PrivateDnsEnabled: true
SecurityGroupIds:
- !Ref EndpointSecurityGroupId
ServiceName: !Sub com.amazonaws.${AWS::Region}.ssm
SubnetIds:
- !Ref SubnetId
VpcEndpointType: Interface
VpcId: !Ref VpcId
SsmMessagesInterfaceEndpoint:
Type: AWS::EC2::VPCEndpoint
Condition: ShouldCreateEndpoints
Properties:
PrivateDnsEnabled: true
SecurityGroupIds:
- !Ref EndpointSecurityGroupId
ServiceName: !Sub com.amazonaws.${AWS::Region}.ssmmessages
SubnetIds:
- !Ref SubnetId
VpcEndpointType: Interface
VpcId: !Ref VpcId
インスタンスプロファイルとセキュリティグループはあらかじめ作成済みのリソースを指定しています。
インスタンスプロファイルには、セッションマネージャーでログインするためにAmazonSSMManagedInstanceCoreポリシーをアタッチしておく必要があります。
また、EC2とVPCエンドポイントのセキュリティグループは、それぞれ以下の設定になっています。
EC2のセキュリティグループ
・ルール:アウトバウンド
・タイプ:HTTPS
・プロトコル:TCP
・ポート範囲:443
・送信先:VPCエンドポイントのセキュリティグループID
VPCエンドポイントのセキュリティグループ
・ルール:インバウンド
・タイプ:HTTPS
・プロトコル:TCP
・ポート範囲:443
・送信先:EC2のセキュリティグループID
ポイント
今回のテンプレートでは、「すでにVPCエンドポイントは作成済みで、EC2だけを追加したい」というケースにも対応できるように工夫しています。
具体的には、テンプレート内のConditions(条件指定)にShouldCreateEndpointsという項目を追加しました。
パラメーターのCreateVpcEndpointsの値をfalseにするだけで、エンドポイントの作成をスキップできる仕組みになっています。
Service Catalogでリソースを作成
作成したCloudFormationテンプレートを元にService Catalogを作成していきます。
ポートフォリオの作成
製品をグループ化して管理するためのポートフォリオを作成します。
- Service Catalogページのサイドメニューからポートフォリオを選択する
- ポートフォリオの作成を押下する
- 以下の項目を入力し、作成を押下する
・ポートフォリオ名:Secure Compute Environment
・所有者:ServiceCatalogManager
製品の作成
リソースの設計図となる製品を作成します。
- ポートフォリオのページから作成したポートフォリオ名を押下し、製品タブから製品を作成を押下する
- 製品の詳細ページで以下の項目を設定し、製品を作成を押下する
・製品タイプ:CloudFormation
・製品名:EC2-and-SSM-Endpoints
・所有者:ServiceCatalogManager
・バージョンソース:テンプレートファイルの使用
ファイルの選択を押下して、ローカルからCloudFormationテンプレートファイル(yaml)をアップロードします
・バージョン名:al2023-v1.0
アクセス権の付与
特定の IAM ユーザー、IAM グループ、または IAM ロールに対して、作成したポートフォリオへのアクセス権を付与します。
今回はIAM Identity Centerの許可セットのロールにアクセス権を付与します。
- 作成したポートフォリオ名を押下し、アクセスタブからアクセス権の付与を押下する
- アクセスタイプでIAM Principalを選択する!
- ロールタブを選択し、アクセス権を付与するロールを選択する
- アクセス権を付与を押下する
リソース作成
以下の手順でリソースをデプロイします。
必要に応じて、各パラメータの値は変更します。
- Service Catalogページのサイドメニューから製品を選択する
- 対象の製品名を選択し、製品を起動を押下する
- 名前を生成をチェックし、製品を起動を押下する
- プロビジョニングされた製品の詳細のステータスが使用可能になるまで待機する
セッションマネージャーによるログイン確認
作成したEC2に対してVPCエンドポイント経由のセッションマネージャーでログインできるか確認します。
1.VPCページのサイドメニューからエンドポイントを選択する
2. 以下、2つのエンドポイントが作成されていることを確認する
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ssmmessages
3. EC2ページに移動し、EC2が新規作成され、起動していることを確認する
4. 新規作成されたEC2を選択し、接続を押下する
5. ウェブブラウザでタブのSSMセッションマネージャーを選択し、接続を押下する
6. ログインできることを確認する
おわりに
今回、Service Catalogを使用してEC2とVPCエンドポイントを作成しました。
実際のプロジェクトでService Catalogを作成するときは、制約、共有機能を使って安全に同じ環境を横展開する必要があると感じました。
また、Service CatalogとCloudFormationの使い分けの重要性を実感しました。
以下のように、ユースケースにあわせて使い分けるのが効果的です。
Service Catalog
・EC2、NATゲートウェイなど1つのアカウント内で複数作成する可能性があるリソースを展開するとき
・パラメータ値の制限などリソース作成におけるガバナンスやルールを強制したいとき
・ユーザーが好きなタイミングでリソースを作成できるプラットフォームを提供したいとき
CloudFormation
・IAMロールやCloudWatchアラームなど1つのアカウント内で1つしか作成しないリソースを展開するとき
・GitHub ActionsやAWS CodePipelineと組み合わせてコードベースで自動構築、一元管理をしたいとき
・複数アカウントへ同時にリソースを展開したいとき
私たちの時間は有限です。
Service Catalogなどの便利なAWSサービスを有効活用して、日々の業務を効率化することを、これからも意識していきたいです。
We Are Hiring!
エンジニアの皆さん、今の環境で「これ以上の成長イメージが湧かない」「新しい技術領域に挑戦できていない」とモヤモヤしていませんか?
FindConsultingでは、最大6か月間、要件定義や基本設計といった最上流から学べる超実践的研修を導入しています。
高い技術力を持つトップエンジニアが直接レクチャーし、メンター制度もあるため安心して成長できる環境が整っています。
現在、FindConsultingでは一緒に働く仲間を大募集中です。
少しでも興味を持っていただけたら、まずはカジュアル面談でざっくばらんにお話ししましょう!


