doridoridoriand’s diary

主に技術的なことを書いていく予定(たぶん)

CloudFormation忘備録

前のエントリーから非常に時間が開いてしまった。。
前のエントリーの投稿日60日前とか死ぬしかない。

本当に意識的に書いていかないと全然続かないな。 忙しかったんだけど、まあ酒飲んでる時間とかちょっと削れば1エントリーくらい書けるわけで。 まあ良い訳ですね。


業務で積極的にCloudFormationを使うようにしており、セキュリティグループやらロードバランサもCloudFormationで作っている。 以外とこの辺をCloudFormationで作っている人が居ないようなので、忘備録がてらブログに記しておく。

AWSのドキュメント読めば正直解決するのであるが、デバッグしずらいところでもあるので、このエントリーが誰かの役に立てばと。

いきなりソースコードから。 (not ステーキ)

---
AWSTemplateFormatVersion: "2010-09-09"
Description: >
  There is the area of description of this CloudFormation template.
Resources:
  WebAPServersSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: SecurityGroup of webservers
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: dev-web-ap-sg
      VpcId: vpc-XXXXXXX

最小構成のセキュリティグループのCloudFormationテンプレートを書いた。

おおまかな構成としては

AWSテンプレートフォーマットのバージョン
このテンプレートの説明
テンプレートで定義しているリソース

となっている。意外と構成要素少ない。なので、リソース配下にどのようなリソースをおけばよいかを書けば基本的には完成する。

一つずつ説明。

WebAPServersSecurityGroup

ここは正直なんと書いても問題ない。これ自体が変数みたいなもの。 今回は例として、WebAPサーバーにアタッチするセキュリティグループとしたので、このように書いているだけ。

Type: AWS::EC2::SecurityGroup

これはどのようなリソースをこのディレクティブ内部で使用するかを定義するもの。これはAWSのドキュメントを調べないとわからないので各自で。

Properties:

この下にネストさせて、色々構成物を定義していく。

GroupDescription: SecurityGroup of webservers
SecurityGroupIngress:
  - IpProtocol: tcp
    FromPort: '80'
    ToPort: '80'
    CidrIp: 0.0.0.0/0

GroupDescription

セキュリティグループの説明文。事業部では英語で書くことが決まりとなっているが、別に日本語でもエラーにはならないと思う。

SecurityGroupIngress

インバウンドのルールのこと。ちなみにアウトバウンド(EC2 => ネット)の方は SecurityGroupEgress。だた、EC2にアタッチするセキュリティグループでアウトバウンドを制限する要件はそれほど高くないと思われるので、今回は割愛。
複数定義したいときは次のように書くことも出来て、

 - IpProtocol: tcp
   FromPort: '80'
   ToPort: '80'
   CidrIp: 0.0.0.0/0
 - IpProtocol: tcp
   FromPort: '443'
   ToPort: '443'
   CidrIp: 0.0.0.0/0

ちなみに更に一気に範囲を指定してあげたいときは

- IpProtocol: tcp
  FromPort: '2000'
  ToPort: '4000'
  CidrIp: 0.0.0.0/0

とすることで 2000~4000番ポートを一気に開けることが出来る。 完成したCloudFormationテンプレートを実際に使用したい時は以下のコマンドを使用する。
(AWS CLIの基本的な使い方はマスターしている前提で話しています。そもそもAWS CLIってなんぞやって方はこちらを参照ください)

$ aws cloudformation create-stack --stack-name=dev-web-application-security-group --template-body=file://dev-web-ap-sg.yml

YAMLファイルを dev-web-ap-sg.yml として保存して、この構成名を dev-web-application-security-group として作成する感じ。

実行すると以下の結果が返ってくる。

/Users/dorian/sandbox aws cloudformation create-stack \
                      --stack-name=dev-web-application-security-group \
                      --template-body=file://dev-web-ap-sg.yml | jq -r
{
  "StackId": "arn:aws:cloudformation:ap-northeast-1:0123456789:stack/dev-web-application-security-group/8d7bf440-c6e9-11e7-931f-500c44f24c1e"
}

マネコンを開いてみると

ててーん。あっという間に完成。実際にセキュリティグループを見てみると

確かにできている。ちなみにCloudFormationの画面を確認してみるとこんな感じで出ていた。

最初に頑張って書いてしまえば、インフラ構成をgitでバージョン管理出来たりするので変更履歴置いやすいし、インフラエンジニアじゃなくてもどのような構成になっているのかを分かってもらえるので変なコミュニケーションが発生せず快適だったりする。