前のエントリーから非常に時間が開いてしまった。。
前のエントリーの投稿日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でバージョン管理出来たりするので変更履歴置いやすいし、インフラエンジニアじゃなくてもどのような構成になっているのかを分かってもらえるので変なコミュニケーションが発生せず快適だったりする。