Terraformに続いてCloudFormationも触ってみたいと思い、とりあえずEC2をたててみました。実際にたててみて、今後どう使っていけばいいかというポイントも書いておきます
テンプレートの基本構文
突然コードかいてもわかりにくいと思うので、ざっくり書き方だけ記載します。
JSONかYAMLでかけるようですが、今回はYAMLで記述しました。
AWSTemplateFormatVersion:
テンプレート形式のバージョンです。現状では"2010-09-09"と固定で記述すればOK。
Description:
その名の通りテンプレートの説明を記載します。
Parameters:
入力値を記述します。環境変数みたいなもので、あとからこのコードを流すときに
パラメーターを渡してあげることができます。(どこで渡すかは後述します)
Resources:
ここがメイン部分です。実際に構築するリソースを記載します。
Typeでリソースの種別、Propertiesで実際の設定値を記載します。
Outputs:
コードを流した後に出力させるパラメータを記載します。
実際のコード
VSCode拡張機能
コードを書く前に、以下2つの拡張をぜひ導入しましょう。
・VS Code Plugin for CloudFormation
コードの補完とかしてくれます。
・CloudFormation Linter
エラーのあぶり出しやってくれます。スタック流さないとエラーがわからないというのはかなりつらいので、必須の拡張機能です。
コード
https://qiita.com/tyoshitake/items/c5176c0ef4de8d7cf5d8 から拝借させていただきました。解説用ということでコメント多めにいれてます。
AWSTemplateFormatVersion: "2010-09-09"
Description: Provision
Parameters:
KeyName: # キーペアはスタック時に入力する
Description: The EC2 Key Pair to allow SSH access to the instance
Type: "AWS::EC2::KeyPair::KeyName"
MyIP: # 変動するものなので外だし。コードを流す時にベット入力する。
Description: IP address allowd to access EC2
Type: String
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Tags:
- Key: Name
Value: vpc-cf
IGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: igw-cf
# IGWをVPCにアタッチ
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC # ID関連は関数Refで取得
InternetGatewayId: !Ref IGW
PubSub:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: ap-northeast-1a
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
Tags:
- Key: Name
Value: pub-sub-a-cf
PubSubRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: pub-sub-a-rt-cf
# PubSub-インターネット間のルーティング
PubSubfToInternet:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PubSubRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref IGW
# ルートテーブルをサブネットに関連付け
AssoPubSubRT:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PubSub
RouteTableId: !Ref PubSubRT
EC2:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-00d101850e971728d # AL2のAMI
KeyName: !Ref KeyName
InstanceType: t2.micro
NetworkInterfaces:
- AssociatePublicIpAddress: "true" # 自動割り当てのパブリックIP
DeviceIndex: "0" # 自動割り当ての場合0で固定
SubnetId: !Ref PubSub
GroupSet:
- !Ref EC2SG
UserData: !Base64 | # インスタンス構築時に実行されるスクリプトと必要なエンコード
#!/bin/bash
sudo yum install -y git: #gitをインストール
Tags:
- Key: Name
Value: ec2-a-cf
EC2SG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: ec2-sg-cf
GroupDescription: Allow SSH and HTTP access only MyIP # SSHとHTTPを許可
VpcId: !Ref VPC
SecurityGroupIngress:
# http
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: !Ref MyIP # 自分のIPからだけ許可
# ssh
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: !Ref MyIP
Outputs:
EC2PublicIP: # EC2のパブリックIPをスタック後に出力させる
Value: !GetAtt EC2.PublicIp
Description: Public IP of EC2 instance
スタックの作成
ここからはAWSコンソール上で実際に上記で作成したコードをCloudFormationに流していきます。
まずはCloudFomationからスタックの作成に進みます。ここで選択するのは新しいリソースで良いです。
①上記で作成したコードを(yaml)をアップロードしてスタックを作成
②スタックの詳細を設定
ここでParameters: の内容を入力します。IPは利用してるネットワークのIPをいれましょう。ここで注意なのは、IPをいれるときに一緒にCIDRもいれてあげる必要があることです。
③スタックオプションの設定→送信
特に設定は不要です。特に設定したい項目がなければ次へ進みましょう。その後確認内容が表示されるので、問題なければ送信します。
送信するとイベントが流れます。最終的にスタックの情報からステータスがCREATE_COMPLETEになれば完了です!
補足
・もしスタックが失敗した場合は、スタックを削除してから最後スタックを送信する必要があります。
・作成したリソースを削除する場合は、スタックを削除すれば消すことができます。
運用するにあたってのポイント
AWSコンソール上で操作
導入もクレデンシャルも設定不要なのはやっぱり強いです。サクッと作ってコード流すだけならTerraformよりも断然早そうです。
スタックの削除
上記でも記載しましたが、スタックが失敗したときに都度消さないといけない&スタックを作り直さないといけないです。CLIを使えば削除は回避できなさそうですが、スタック入力し直しの手間は省くことができそうです。
ファイル(コード)の分割
今回の手順だと1ファイルしかアップロードできませんが、S3を使ったネストでファイルの分割もできるようです。
まだまだCloudformtionの可能性を探って行きます