AWS CloudFormationとは?
AWS Cloudformation のIaCサービスでは、ソースコード一つでインフラストラクチャーを自動構成できる。
CloudFormationはプログラミング言語やテキストファイルを使用してAWSリソースを自動で構築するサービスです。所望のAWS環境をテンプレート化しておくことで、同じ環境を作成する時間を削減することができます。CloudFormation特徴としては以下があげられます。
・AWSリソースを自動で作成できる
・テンプレートを作成すると、同じ構成を何度も構築できる。
利用料金は無料(利用するのに必要なリソース分の料金がかかる)
jsonかyaml形式のソースコードでAWSインフラ構成を自動構成することができてとても便利です。
ハンズオンや仕事でAWSインフラ構成をする際に手順書を元に画面操作をするとインフラストラクチャーを再現できないことがある。
MacOSにcfn-lintをインストールする。
AWS CloudFormation Linter (cfn-lint) は、AWS CloudFormation テンプレートの詳細な検証を行うために使用できるオープンソースのツールです。 cfn-lint には、AWS CloudFormation リソース仕様に基づくルールが含まれています。
brew install cfn-lint
実行する時
cfn-lint exsample.yaml
ソースコードの形式や構文を勉強しないといけないデメリットがあるがEC2すぐ試したい時におすすめだろう。
下にEC2を立てるサンプルのソースコードを表示します。
AWSTemplateFormatVersion: '2010-09-09'
# 東京リージョンでCloudformaion作業すること
Resources:
#------------------------------------------------------
# VPC
#------------------------------------------------------
AWSServerSample:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 11.0.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
Tags:
- Key: Name
Value: "AWSServerSample"
#------------------------------------------------------
# サブネット
#------------------------------------------------------
PublicSubnetA:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: !Sub ${AWS::Region}a
CidrBlock: 11.0.0.0/24
MapPublicIpOnLaunch: 'true'
VpcId: !Ref AWSServerSample
Tags:
- Key: Name
Value: "MultiAZSample0A"
#------------------------------------------------------
# インターネットゲートウェイ
#------------------------------------------------------
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: AWSServerSample
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref InternetGateway
VpcId: !Ref AWSServerSample
#------------------------------------------------------
# ルートテーブルをパブリックサブネットにアタッチ
#------------------------------------------------------
RouteTableForPublicSubnetA:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref AWSServerSample
RouteForPublicSubnetA:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref RouteTableForPublicSubnetA
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
AssocciateRouteTableForPublicSubnetA:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnetA
RouteTableId: !Ref RouteTableForPublicSubnetA
#------------------------------------------------------
# セキュリティーグループ(EC2Instance)
#------------------------------------------------------
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security Group for EC2
VpcId: !Ref AWSServerSample
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: EC2SecurityGroup
#------------------------------------------------------
# EC2Instance
#------------------------------------------------------
EC2Instance01:
Type: AWS::EC2::Instance
Properties:
# Ubuntu 22.04を使用
ImageId: ami-088da9557aae42f39
InstanceType: t3.micro
SecurityGroupIds:
- !Ref EC2SecurityGroup
SubnetId: !Ref PublicSubnetA
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: gp3
DeleteOnTermination: true
VolumeSize: 10
Tags:
- Key: Name
Value: EC2Instance01
UserData:
Fn::Base64: |
#!/bin/bash
UbuntuにWordPressセットアップ
S3で静的サイト公開設定するCloudformation
Amazon S3では、静的サイト「HTML、CSS、JavaScript、img(画像ファイル)」するにあたってS3バケット作成とバケットポリシーが必要である。
S3バケット作成とバケットポリシーを自動作成できるCloudformationを作成した。
AWSTemplateFormatVersion: 2010-09-09
Description: The CloudFormation template that creates a public open S3 bucket.
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Parameters:
BucketName:
Type: String
Description: S3 Bucket name.
Default: koseizakio-public-bucket
MaxLength: 50
MinLength: 3
Resources:
# ------------------------------------------------------------#
# S3
# ------------------------------------------------------------#
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref BucketName
PublicAccessBlockConfiguration:
BlockPublicAcls: false
BlockPublicPolicy: false
IgnorePublicAcls: false
RestrictPublicBuckets: false
Tags:
- Key: Cost
Value: !Ref BucketName
S3BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref S3Bucket
PolicyDocument:
Version: "2012-10-17"
Statement:
- Action:
- "s3:GetObject"
Effect: Allow
Resource: !Sub "arn:aws:s3:::${S3Bucket}/*"
Principal: "*"
DependsOn:
- S3Bucket
# ------------------------------------------------------------#
# Output Parameters
# ------------------------------------------------------------#
Outputs:
#S3
S3BucketName:
Value: !Ref S3Bucket
TopPageURL:
Value: !Sub https://s3.${AWS::Region}.amazonaws.com/${S3Bucket}/index.html
HTMLのサンプルをS3バケットにアップロードすれば静的サイト作成完了となる。
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
<title>Hello, world!</title>
</head>
<body>
<h1>Hello, world!</h1>
<!-- Optional JavaScript; choose one of the two! -->
<!-- Option 1: Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
以下のように表示される。