🙆♀️
【CloudFormation】EC2 起動時に Apache を初期インストールするテンプレート
こんにちは、Masuyama です。
CloudFormation にハマっているので、前回の記事↓で紹介した、ユーザーデータを用いて Apache を EC2 に初期インストールするテンプレートを紹介します。
→EC2作成時にApacheをユーザーデータで初期インストールする方法
なお、本記事で紹介するテンプレートは GitHub にも上げておきます。
テンプレートでのユーザーデータ設定方法
EC2 リソースを指定する際、Properties の中に UserData というプロパティを入れて設定します。
下記の例では Apache のインストールから起動、自動起動設定まで行いつつ
index.html に文字列を設定する初期スクリプトを設定しています。
EC2:
Type: AWS::EC2::Instance
Properties:
...
UserData:
Fn::Base64: |
#!/bin/bash
yum -y update
yum -y install httpd
systemctl start httpd
systemctl enable httpd
echo "Apache is runnning by using UserData" > /var/www/html/index.html
本テンプレートで作れるもの
- VPC x1
- サブネット x1
- EC2 x1 (Apache 起動)
テンプレート全文
cf-ec2-userdata-apache-install.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: Provision EC2
Parameters:
EnvironmentName:
Description: Name which you can specify the environment by this name
Type: String
Default: test-environment
VpcCIDR:
Type: String
Default: 10.0.0.0/16
PublicSubnetCIDR:
Type: String
Default: 10.0.0.0/24
KeyName:
Description: The EC2 Key Pair to allow SSH access to the instance
Type: "AWS::EC2::KeyPair::KeyName"
MyIP:
Description: IP address range which is allowed to access this EC2 from it
Type: String
Default: 0.0.0.0/0
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCIDR
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-VPC
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-InternetGateway
# Attach InternetGateway to VPC
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1a
VpcId: !Ref VPC
CidrBlock: !Ref PublicSubnetCIDR
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-PublicSubnet
PublicSubnetRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-PublicSubnetRouteTable
# Routing from PublicSubnet to Internet
PublicSubnetToInternet:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicSubnetRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
# Associate PublicSubnetRouteTable to PublicSubnet
AssoPublicSubnetRouteTable:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet
RouteTableId: !Ref PublicSubnetRouteTable
EC2:
Type: AWS::EC2::Instance
Properties:
# Amazon Linux 2
ImageId: ami-00d101850e971728d
KeyName: !Ref KeyName
InstanceType: t2.micro
NetworkInterfaces:
- AssociatePublicIpAddress: "true"
DeviceIndex: "0"
SubnetId: !Ref PublicSubnet
GroupSet:
- !Ref EC2SecurityGroup
UserData:
Fn::Base64: |
#!/bin/bash
yum -y update
yum -y install httpd
systemctl start httpd
systemctl enable httpd
echo "Apache is runnning by using UserData" > /var/www/html/index.html
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-EC2
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: ec2-sg-cf
GroupDescription: Allow SSH and HTTP access from only MyIP
VpcId: !Ref VPC
SecurityGroupIngress:
# http
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: !Ref MyIP
# ssh
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: !Ref MyIP
Web サーバへのアクセステスト
自動的に割り当てられたパブリック IP をブラウザで叩くと、ユーザーデータで指定した文字列が表示されていることが分かるかと思います。
Discussion