こんにちは、エデュケーショナルサービス課の小倉です。
2024年からパーソル&サーバーワークスというグループ会社で中途入社のエンジニア向けにトレーニングを行っています。
そのトレーニングの中で、要件に応じてAWSの構成を考える「RFPチャレンジ」というコンテンツがあります。構成を考える上で、だいたいの人がアクセス数が増えてきたときの対策としてEC2 Auto Scalingを使います。ただ、このEC2 Auto Scalingで利用するAMIの更新(パッチ適用など)については考慮できていなかったり、AMIからEC2作成、パッチ適用、AMI取得、起動テンプレート更新という手順を手動で行ったりというのをよく目にします。AWSではもっと楽にできるEC2 Image Builderという機能があるのでこちらを説明します。
EC2 Image Builderとは
Amazon Machine Image (AMI)やコンテナイメージのカスタマイズやテストを行うことができるフルマネージド型のサービスです。 先の説明にでてきた、AMIからEC2作成、パッチ適用、AMI取得、起動テンプレート更新というのを自動で行うことができます。
[AWS Black Belt Online Seminar] AWS EC2 Image Builder
構成図
今回の検証環境の構成図で、インターネットからHTTPでアクセスできるようにしておきます。
この環境でEC2 Image Builderを使って、EC2 Auto Scalingの起動テンプレートのAMIを更新します。

作業手順
EC2の作成
EC2 Auto Scalingで使用するAMIを作成するため、EC2を起動します。
EC2設定
- AMI:Amazon Linux 2023
- ネットワーク:デフォルトVPC
- パブリック IP の自動割り当て:有効化
- ファイアウォール:HTTPを許可
- ユーザーデータ:以下を記入
#!/bin/bash -v exec > >(tee /var/log/user-data.log || logger -t user-data -s 2> /dev/console) 2>&1 dnf -y update dnf -y install httpd echo 'Hello World!' > /var/www/html/index.html systemctl start httpd.service systemctl enable httpd
これでEC2を起動し、AMIの取得を行います。AMIを取得した後にはAMI IDを控えておきましょう(あとで使います)。
EC2 Auto Scaling環境の構築
CloudFormationテンプレートを用意しましたので、以下を実行して検証環境を準備してください。 パラメータの入力画面でWebAppImageIdに先ほど取得したAMI IDを入力します。
AWSTemplateFormatVersion: "2010-09-09"
Description: Auto Scaling test
Parameters:
VPCCIDR:
Type: String
Default: "10.0.0.0/16"
PublicSubnetACIDR:
Type: String
Default: "10.0.0.0/24"
PublicSubnetCCIDR:
Type: String
Default: "10.0.1.0/24"
PrivateSubnetACIDR:
Type: String
Default: "10.0.10.0/24"
PrivateSubnetCCIDR:
Type: String
Default: "10.0.20.0/24"
WebAppImageId:
Description: Image Id
Type: String
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VPCCIDR
EnableDnsSupport: true
EnableDnsHostnames: true
InstanceTenancy: default
Tags:
- Key: Name
Value: training-dev-vpc-web
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: training-dev-igw
InternetGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref InternetGateway
VpcId: !Ref VPC
PublicSubnetA:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1a
CidrBlock: !Ref PublicSubnetACIDR
VpcId: !Ref VPC
Tags:
- Key: Name
Value: training-dev-subnet-public-a
PublicSubnetC:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1c
CidrBlock: !Ref PublicSubnetCCIDR
VpcId: !Ref VPC
Tags:
- Key: Name
Value: training-dev-subnet-public-c
PrivateSubnetA:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1a
CidrBlock: !Ref PrivateSubnetACIDR
VpcId: !Ref VPC
Tags:
- Key: Name
Value: training-dev-subnet-private-a
PrivateSubnetC:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1c
CidrBlock: !Ref PrivateSubnetCCIDR
VpcId: !Ref VPC
Tags:
- Key: Name
Value: training-dev-subnet-private-c
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: training-dev-rt-public
PrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: training-dev-rt-private
PublicRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnetARouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnetA
RouteTableId: !Ref PublicRouteTable
PublicSubnetCRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnetC
RouteTableId: !Ref PublicRouteTable
PrivateSubnetARouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnetA
RouteTableId: !Ref PrivateRouteTable
PrivateSubnetCRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnetC
RouteTableId: !Ref PrivateRouteTable
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref VPC
GroupName: training-dev-sg-alb-public
GroupDescription: ALB Security Group for Training
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: training-dev-sg-alb-public
SecurityGroupForWebAppInstance:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref VPC
GroupDescription: Web App Security Group for Training
GroupName: training-dev-sg-webapp
SecurityGroupIngress:
- SourceSecurityGroupId: !Ref ALBSecurityGroup
IpProtocol: tcp
FromPort: 80
ToPort: 80
Tags:
- Key: Name
Value: training-dev-sg-webapp
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
VpcId: !Ref VPC
Name: training-dev-tg-public
Protocol: HTTP
Port: 80
Matcher:
HttpCode: 200
Tags:
- Key: Name
Value: training-dev-tg-public
InternetALB:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: training-dev-alb-public
Tags:
- Key: Name
Value: training-dev-alb-public
Scheme: internet-facing
SecurityGroups:
- !Ref ALBSecurityGroup
Subnets:
- !Ref PublicSubnetA
- !Ref PublicSubnetC
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- TargetGroupArn: !Ref TargetGroup
Type: forward
LoadBalancerArn: !Ref InternetALB
Port: 80
Protocol: HTTP
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateName: 20250603-template
LaunchTemplateData:
ImageId: !Ref WebAppImageId
InstanceType: t3.micro
SecurityGroupIds:
- !Ref SecurityGroupForWebAppInstance
ServerGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
VPCZoneIdentifier:
- !Ref PrivateSubnetA
- !Ref PrivateSubnetC
LaunchTemplate:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
MaxSize: '2'
MinSize: '2'
TargetGroupARNs:
- !Ref TargetGroup
10分くらい経過したら環境ができあがります。
EC2 Image Builderの設定
EC2 Image Builderのパイプラインを作成することで、AMIからEC2作成、パッチ適用、AMI取得、起動テンプレート更新を行うことができます。
1.EC2 Image Builderのコンソール画面を表示し、[イメージパイプラインを作成] をクリック
2.パイプラインの詳細を指定するの画面で、パイプライン名の入力、スケジュールオプションは手動を選択し、[次へ] をクリック
3.レシピを選択の画面で、まずは以下の赤で囲んであるところを選択、入力を行います。AMI IDは最初に作成したEC2から取得したAMIのIDを入力します。
4.下にスクロールして、コンポーネントの設定を行います。ビルドコンポーネントではAMIを作成するときに実行する内容を定義、テストコンポーネントではビルドした後に正常に稼働するかのテストを定義します。
今回は検証なのでセキュリティパッチを適用するだけを設定します。まず、[ビルドコンポーネントを追加] - [Amazon管理] をクリックします。画面右上の検索窓に update と入力し、結果に表示される update-linux にチェックを入れ、[レシピに追加] をクリックします。
同様にテストコンポーネントも追加します。
今回は再起動が正常に行われるかのテストを設定します。[テストコンポーネントを追加] - [Amazon管理] をクリックします。画面右上の検索窓で reboot と入力し、結果に表示される reboot-test-linux にチェックを入れ、[レシピに追加] をクリックします。
あとは変更せずに一番下までスクロールして、[次へ] をクリックします。
5.イメージ作成プロセスを定義するの画面で、デフォルトワークフローを選択して、[次へ] をクリックします。
6.インフラストラクチャ設定を定義するの画面で、サービスデフォルトを使用してインフラストラクチャ設定を作成する を選択して、[次へ] をクリックします。
7.ディストリビューション設定を定義するの画面で、新しいディストリビューション設定を作成する を選択と名前を入力し、起動テンプレートのAMIの更新を設定します。
起動テンプレート設定をクリックして、設定を表示します。[起動テンプレート設定を追加] をクリックし、CloudFormationで作成した起動テンプレートを選択します(テンプレートのまま実行すると 20250603-template で作成されています)。
あとは変更せずに一番下までスクロールして、[次へ] をクリックします。
8.確認の画面が表示されるので、内容を確認して [パイプラインの作成] をクリックします。
これで、パイプラインの作成が終わりました。
画面右上の [アクション] - [パイプラインの実行] をクリックするとAMIの更新を行うことができます。完了まで20分くらいかかりました。
起動テンプレートのバージョンを確認するとAMIが更新されていることが確認できます。
起動テンプレートのAMIが更新された後にAuto Scaling グループのインスタンスの更新を行うことで、最新のAMIでEC2を起動しなおすことができます。古いブログですが、こちらでインスタンスの更新について説明をしています。
blog.serverworks.co.jp
これで、設定は完了です。今後はこのEC2 Image Builderのパイプラインを実行するだけでAMIを更新することができるようになりました。
まとめ
EC2 Image Builderについて紹介しました。最初の設定はちょっと面倒かもしれないですが、このサービスを使うことでAMIのパッチ適用などが楽になる可能性があります。
すべては要件次第ではありますが、設計をする時に運用面も考慮できるとよりよくなると考えています。
小倉 大(記事一覧)
アプリケーションサービス部エデュケーショナルサービス課 札幌在住
AWSトレーニングの講師をしています。
最近は7歳の息子と遊ぶのが楽しいです!
Twitter: @MasaruOgura