フェイス・ソリューション・テクノロジーズ株式会社 IS 本部 OS ユニットの Saki@猫好き です。AWS 活用していますか?
今日は、AWS CloudFormation を利用して、Amazon VPC を構築する方法について書いてみたいと思います。
はじめに
AWS の利用を開始したばかりの初心者にありがちなのが、VPC を指定せずに EC2 インスタンスを立ち上げる、というものです。私も、AWS アカウントを作成したての頃は、Amazon VPC の有用性を理解することなくいきなり EC2 インスタンスを立ち上げて、中身の構築を行っていました。
Amazon VPC がどういうものか、については、弊社ブログで OS ユニットのメンバー Toshi が書いていますので、そちらをご確認ください。
現在は、マネジメントコンソールから VPC の構築を行うと、随分と簡単に出来てしまいます。こちらについても、弊社ブログで OS ユニットのメンバー Toshi が書いていますので、そちらをご確認ください。
少し序の文が長くなりますが、私個人の VPC の分割についての考え方を紹介させてください。
VPC を分ける必要はあるのか?
「VPC を分ける必要はあるのか?」よく聞かれる内容です。
環境を分散(開発、テスト、本番)させたり、プロジェクト内で別要件が発生して新たに EC2 インスタンスを立ち上げたりする際に、わざわざ新しく VPC を構築しなくてもよくね? って感じです。
確かに、以前のマネジメントコンソールからの VPC の構築でしたら、ルートテーブルを作成したり IGW 設定したりサブネットを複数用意したりと、面倒な作業でした。
ルートテーブルや IGW、要件によっては NAT ゲートウェイなど、多少、インフラが理解できていないと手を付けるのは難しいという印象でした。
しかし、最近はマネジメントコンソールからの作成で簡単に VPC が作成できます。インフラの知識はほとんど不要で VPC が作成されます(実際に使っていくうえではこういった知識が絶対に必要です。勉強した方が良いと思います)。
そこで、このブロックの見出しにある質問「VPC を分ける必要はあるのか?」です。
私の考えとしては、用途ごとにアカウントを分けて利用するのが良い、と思っています。
VPC ごとに環境を分けておけば、VPC ごとの接続可否設定を IAM ポリシーで作成し、それをユーザーにアタッチすることで、最小権限のルールを達成することが可能である。
ソリューションアーキテクトの試験でもよく問われる内容です。私としては、これをアカウントレベルに引き上げることで、更に管理がしやすくなるのではないかと考えています。
1 アカウント 1 リソースに限定すれば、複雑なリソース単位の IAM ポリシーを作成する必要はないですし。AWS Organizations とスイッチロールを利用すれば、ユーザー管理を簡単に行うことができます。
AWS Organizations やスイッチロールについては、私が以前書いた記事をご参照いただけますと幸いです。
もちろん、アカウントを分けて利用すると、クロスアカウントによるログ管理や監視設定など、新たな知識が必要となってきます。
もし、お悩みごとがございましたら、弊社にご相談くださいませ。
結局、なんで CloudFormation を利用して VPC を構築するのか
ここまで読んでくださった方であれば、マネジメントコンソールから簡単に VPC が構築できるのなら、CloudFormation を利用する必要ないんじゃない? って思われる方もいらっしゃるかもしれません。
確かに、各ユーザーがきちんと自分の作成したリソースを管理してくれるのであれば、各ユーザーに任せてもいいかもしれないです。もちろん、大手の会社様であれば、リソースの作成管理まで情シス部で行っていて、各ユーザーが自由にリソースを作れないようになっていたりするのでしょうけれど。
弊社くらいの規模であれば、各ユーザーにリソースの作成権限があります。そうなるとですね「開発環境の構築のためのテスト」で作成を試したとみられるリソースが残されたままになっていたりするのです。皆様ご存じの通り、VPC はリージョン内でデフォルトで 5 つしか作成できません。何度もテストで作成を繰り返し、手順を確定して、いざ本構築、となった瞬間。
出鼻を挫かれるとはこういうことだ!
もちろん、他にもいろいろなリソースの残骸を目撃してきましたし、中には「お金かかるじゃん!」ってこともありました。
AWS CloudFormation を利用していれば、スタックの削除だけで済むのにね。
そこで、ようやく本題です。今回は、VPC の作成を AWS CloudFormation を利用して行ってみたいと思います。
作成してみる
今回作成するのはこんな構成
ごくごくありふれた VPC の構成となっています。
Availability Zone をまたいで VPC を設定し、それぞれの Availability Zone に Public Subnet と Private Subnet を設置する。AZ 障害に強い、マルチ AZ 構成をとるための VPC の構成です。
CloudFormation テンプレート
テンプレートは、次のようなものになります(私は、vpc-test.yml という名前で保存しました)。
VPC の Cidr を 10.0.0.0/16 としています。
Public Subnet、Private Subnet に、10.0.0.0/24 ~ 10.0.0.3/24 を設定しています。
Availability Zone については、組み込み関数を利用して、利用可能な AZ の 0 番目と 1番目を取得して利用します。
IGW をアタッチし、Route Table で 0.0.0.0/0 で Public Subnet に接続可能としています。
AWSTemplateFormatVersion: 2010-09-09
Description: Template for VPC
Resources:
CFnVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
InstanceTenancy: default
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: cfn-test
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.0.0/24
VpcId: !Ref CFnVPC
AvailabilityZone: !Select [ 0, !GetAZs ]
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: PublicSubnet1
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.1.0/24
VpcId: !Ref CFnVPC
AvailabilityZone: !Select [ 1, !GetAZs ]
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: PublicSubnet2
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.2.0/24
VpcId: !Ref CFnVPC
AvailabilityZone: !Select [ 0, !GetAZs ]
Tags:
- Key: Name
Value: PrivateSubnet1
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.3.0/24
VpcId: !Ref CFnVPC
AvailabilityZone: !Select [ 1, !GetAZs ]
Tags:
- Key: Name
Value: PrivateSubnet2
CFnVPCIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: cfn-test
CFnVPCIGWAttach:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref CFnVPCIGW
VpcId: !Ref CFnVPC
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref CFnVPC
Tags:
- Key: Name
Value: Public Route
PublicRoute:
Type: AWS::EC2::Route
DependsOn: CFnVPCIGW
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref CFnVPCIGW
PublicSubnet1Association:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref PublicRouteTable
PublicSubnet2Association:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet2
RouteTableId: !Ref PublicRouteTable
CloudFormation で起動する
CloudFormation のマネジメントコンソールから、テンプレート yaml ファイルをアップロードする
スタックの名前はわかりやすいものを!
以降は、デフォルトで進め、最後「送信」をクリックします
しばらく待って、「CREATE_COMPLETE」となれば成功です
(なかなか変わらない場合は、「スタック」の文字の右にある更新ボタンを押してみてください)
Amazon VPC のマネジメントコンソールを確認します
問題なく VPC が作成されているようです。
スタックの削除
リソースの消し忘れ問題も、スタックの削除で解消できます。
CloudFormation マネジメントコンソールから削除するスタックを選択し、「削除」をクリックします。
※簡単に削除されてしまいますので十分に注意して、必要なリソースを誤って削除しないようにしてください!
Amazon VPC のマネジメントコンソールを確認します
完全に消えているのが確認できます。
おまけ
VPC がリージョン内で 5 つ作成されている状態で、CloudFormation を走らせた場合のエラー。
手動で作成したときと同様のエラーが表示されるようです。
最後に
今回はいろいろと考えることがあって、文章が長くなってしまいました。
私としては、すべてのリソースをアカウントごとに分けた方が良いのでは、と考えているだけで、管理上の問題、クロスアカウントの設定など、クリアしなければならない問題が多く存在しているのは事実です。解決方法については、是非、弊社にご相談ください。
今回作成した VPC 設定は画一的なもので、パラメータセクションを追加して Cidr ブロックの設定、ルートテーブルの設定、タグの設定を行ったり、Output セクションを追加して他のリソースでこの VPC を利用できるようにしたりすれば、複数の環境を柔軟に用意できるようになります。
それを、複数のアカウントで利用するか、1 つのアカウント内で利用するか、については、様々議論がると思いますのでまたの機会に。
CloudFormation を上手に利用して、簡単管理な楽しい AWS ライフをお送りください。
引き続き、よろしくお願いいたします!
コメント