2013.7.15
吉田真吾 @yoshidashingo
BCPに活かせ!
CloudFormation
自己紹介
名前:吉田真吾
アイレット株式会社 cloudpack エバンジェリスト
JAWS-UG 横浜 代表
好きなAWSサービス:Amazon S3
好きなAWSクラウドデザインパターン:Direct
Hostingパターン
アジェンダ
cloudpack 紹介
事例
AWS CloudFormation の活用方法
AWS CloudFormation Tips
まとめ
AWS運用をアウトソースしたい企業向けの
月額費用固定型フルマネージドホスティング
24時間365日サーバー運用・保守
•電話/メールによるサポート
初期費用なし(基本移行作業含む)
月額5万円からのスタート
日本円で請求書発行
フルマネージド
サービス/リソース監視
ディスク使用量、メモリ使用量、プロセス数、
Webサーバー・DBサーバー死活...
バックアップ/リストア
EBSスナップショットを利用した二世代(過去
二日分)バックアップ
アクセス制御(ファイアーウォール)
適切なセキュリティグループを設定、OS・ミド
ルウェアレベルでさらに細かな設定も対応可能
定額課金・請求書払い
従量課金では予算計画が立てられない
クレジットカードでUSドル決済では利用料の予測が難しい
Amazon Web Servicesでは...
月額固定+日本円請求書発行
バースト保障
キャンペーンなど急激なアクセス増加へ合わせてインフラ
準備するのは不可能
いつあるかわからないピークのために予め準備できない
追加料金無しでスケールアウト
(7インスタンス日まで)
日本初のAPNプレミア コンサルティングパートナーの
一社として認定されました。
Confidential
AWS
CloudFormation
事例
インフラ設計・構築
インターネット公式サイト
月間1億PV 45億ヒット、
新車発表時3倍のアクセス
すべて冗長化
オンプレに環境再生可能な
バックアップ
東京リージョン障害時に
シンガポールで復旧可能
DR用CloudFormation
CloudFormationでシンガポールリージョ
ンに環境構築
テンプレートから一発で構築可能
Tokyo Region Singapore Region
CloudForma*on,
Template, Stack,
ベストプラクティスの集大成
CloudFront
Clone Server
Multi-Datacenter
Cache Distribution
DB Replication
Bootstrap
Stack Deployment
HA NAT
DR
リリース時のバースト
公開時、想定を超えるアクセスが集中
スケールアウト、そしてスケールアップ
を同時に
スケールアウト
スケールアップ
ポイント
大規模プロジェクトでのスケジュール管理
インフラ構築フェーズの位置、前後のタスク
Bプランをいつも準備されている
AWSすら信頼しない前提でのリスク管理
オンプレ環境へのデータバックアップ
シンガポールリージョンの準備
Confidential
AWS
CloudFormation
説明
AWS CloudFormation
JSON形式で記述したテンプレートを利用する
ことで、システムのスタックまるごとデプロ
イ・更新・削除できるサービス
テンプレートのパート
Resources:作成したいリソースの定義
Parameters:画面から指定する引数
Mappings:条件に応じて入替える引数リスト
Outputs:結果の出力
{
	
  	
  "Parameters"	
  :	
  {
	
  	
  	
  	
  "KeyName"	
  :	
  {
	
  	
  	
  	
  	
  	
  "Description"	
  :	
  "Name	
  of	
  an	
  existing	
  EC2	
  KeyPair	
  to	
  enable	
  SSH	
  access	
  to	
  the	
  instance",
	
  	
  	
  	
  	
  	
  "Type"	
  :	
  "String"
	
  	
  	
  	
  }
	
  	
  },
	
  	
  "Mappings"	
  :	
  {
	
  	
  	
  	
  "RegionMap"	
  :	
  {
	
  	
  	
  	
  	
  	
  "us-­‐east-­‐1"	
  :	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "AMI"	
  :	
  "ami-­‐76f0061f"
	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  "us-­‐west-­‐1"	
  :	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "AMI"	
  :	
  "ami-­‐655a0a20"
	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  "eu-­‐west-­‐1"	
  :	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "AMI"	
  :	
  "ami-­‐7fd4e10b"
	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  "ap-­‐southeast-­‐1"	
  :	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "AMI"	
  :	
  "ami-­‐72621c20"
	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  "ap-­‐northeast-­‐1"	
  :	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "AMI"	
  :	
  "ami-­‐8e08a38f"
	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  }
	
  	
  },
	
  	
  "Resources"	
  :	
  {
	
  	
  	
  	
  "Ec2Instance"	
  :	
  {
	
  	
  	
  	
  	
  	
  "Type"	
  :	
  "AWS::EC2::Instance",
	
  	
  	
  	
  	
  	
  "Properties"	
  :	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "KeyName"	
  :	
  {	
  "Ref"	
  :	
  "KeyName"	
  },
	
  	
  	
  	
  	
  	
  	
  	
  "ImageId"	
  :	
  {	
  "Fn::FindInMap"	
  :	
  [	
  "RegionMap",	
  {	
  "Ref"	
  :	
  "AWS::Region"	
  },	
  "AMI"	
  ]},
	
  	
  	
  	
  	
  	
  	
  	
  "UserData"	
  :	
  {	
  "Fn::Base64"	
  :	
  "80"	
  }
	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  }
	
  	
  }
}
 	
  "Outputs":	
  {
	
  	
  	
  	
  "InstallURL":	
  {
	
  	
  	
  	
  	
  	
  "Value":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "Fn::Join":	
  [
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "http://",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "Fn::GetAtt":	
  [
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "ElasticLoadBalancer",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "DNSName"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "/wp-­‐admin/install.php"
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]
	
  	
  	
  	
  	
  	
  	
  	
  ]
	
  	
  	
  	
  	
  	
  },
	
  	
  	
  	
  	
  	
  "Description"	
  :	
  "Installation	
  URL	
  of	
  the	
  WordPress	
  website"
	
  	
  	
  	
  },
	
  	
  	
  	
  "WebsiteURL":	
  {
	
  	
  	
  	
  	
  	
  "Value":	
  {
	
  	
  	
  	
  	
  	
  	
  	
  "Fn::Join":	
  [
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "http://",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "Fn::GetAtt":	
  [
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "ElasticLoadBalancer",
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  "DNSName"	
  ]
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]
	
  	
  	
  	
  	
  	
  	
  	
  ]
	
  	
  	
  	
  	
  	
  }
	
  	
  	
  	
  }
	
  	
  }
Confidential
AWS
CloudFormation
Tips
Tips
テンプレートを再利用可能なモジュ
ール分割(パラメータ、アウトプッ
ト)してチェーン実行しよう
同じ役割のサーバーを複数作成する
ならオートスケーリングで管理しよう
(可用性の観点からも Good!)
テンプレートのチェーン
"Resources":	
  {
  "CloudFormationStackVPCBasic"	
  :	
  {
    "Type":	
  "AWS::CloudFormation::Stack",
    "Properties":	
  {
      "TemplateURL":	
  "https://s3-­‐ap-­‐northeast-­‐1.amazonaws.com/template.suz-­‐lab.com/template/suz-­‐lab_vpc-­‐
basic-­‐0.0.1.json",
"TimeoutInMinutes":	
  "60"
    }
  },
  "CloudFormationStackOnDemandNAT"	
  :	
  {
    "Type":	
  "AWS::CloudFormation::Stack",
    "Properties":	
  {
      "TemplateURL"	
  :	
  "https://s3-­‐ap-­‐northeast-­‐1.amazonaws.com/template.suz-­‐lab.com/template/suz-­‐
lab_ondemand-­‐nat-­‐0.0.1.json",
      "Parameters"	
  :	
  {
        "KeyName":	
  {	
  "Ref":	
  "KeyName"	
  },
        "ImageId":	
  {	
  "Ref":	
  "OnDemandNATImageId"	
  },
        "InstanceType":	
  {	
  "Ref":	
  "OnDemandNATInstanceType"	
  },
        "Name":	
  {	
  "Ref":	
  "OnDemandNATName"	
  },
        "RouteTableId":	
  {	
  "Fn::GetAtt"	
  :	
  [	
  "CloudFormationStackVPCBasic",	
  
"Outputs.RouteTableIdProtected"	
  ]	
  },
        "SecurityGroupId":	
  {	
  "Fn::GetAtt"	
  :	
  [	
  "CloudFormationStackVPCBasic",	
  
"Outputs.SecurityGroupIdCommon"	
  ]	
  },
        "SubnetId":	
  {	
  "Fn::GetAtt"	
  :	
  [	
  "CloudFormationStackVPCBasic",	
  "Outputs.SubnetIdPublicVarA00"	
  ]	
  },
        "VpcId":	
  {	
  "Fn::GetAtt"	
  :	
  [	
  "CloudFormationStackVPCBasic",	
  "Outputs.VpcIdBasic"	
  ]	
  }
      }
    }
  }
},
親テンプレートの定義
同一レイヤーは Auto Scaling で
"Resources":	
  {
	
   "AutoScalingLaunchConfig"	
  :	
  {
	
   	
   "Type"	
  :	
  "AWS::AutoScaling::LaunchConfiguration",
	
   	
   "Properties"	
  :	
  {
	
   	
   	
   "KeyName"	
  	
  	
  	
  	
  	
  	
  	
  :	
  {	
  "Ref"	
  :	
  "KeyName"	
  },
	
   	
   	
   "ImageId"	
  	
  	
  	
  	
  	
  	
  	
  :	
  {	
  "Ref"	
  :	
  "ImageId"	
  },
	
   	
   	
   "SecurityGroups"	
  :	
  {	
  "Ref"	
  :	
  "SecurityGroups"	
  },
	
   	
   	
   "InstanceType"	
  	
  	
  :	
  {	
  "Ref"	
  :	
  "InstanceType"	
  }
	
   	
   }
	
   },
	
   "AutoScalingAutoScalingGroup"	
  :	
  {
	
   	
   "Type"	
  :	
  "AWS::AutoScaling::AutoScalingGroup",
	
   	
   "Properties"	
  :	
  {
	
   	
   	
   "DesiredCapacity"	
  	
  	
  	
  	
  	
  	
  	
  	
  :	
  {	
  "Ref"	
  :	
  "CapacitySize"	
  },
	
   	
   	
   "LaunchConfigurationName"	
  :	
  {	
  "Ref"	
  :	
  "AutoScalingLaunchConfig"	
  },
	
   	
   	
   "MaxSize"	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :	
  {	
  "Ref"	
  :	
  "CapacitySize"	
  },
	
   	
   	
   "MinSize"	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  :	
  {	
  "Ref"	
  :	
  "CapacitySize"	
  },
	
   	
   	
   "AvailabilityZones"	
  :	
  [
	
   	
   	
   	
   {	
  "Fn::FindInMap"	
  :	
  [	
  "AzMap",	
  {	
  "Ref"	
  :	
  "AWS::Region"	
  },	
  "Az1"	
  ]	
  },
	
   	
   	
   	
   {	
  "Fn::FindInMap"	
  :	
  [	
  "AzMap",	
  {	
  "Ref"	
  :	
  "AWS::Region"	
  },	
  "Az2"	
  ]	
  }
	
   	
   	
   ],
	
   	
   "Tags"	
  :	
  [
	
   	
   	
   {	
  "Key"	
  :	
  "Name",	
  "Value"	
  :	
  {	
  "Ref"	
  :	
  "Name"	
  },	
  "PropagateAtLaunch"	
  :	
  true	
  }
	
   	
   ]
	
   	
   }
	
   }
},
Parameters
AWSのみでクレジット決済の
インフラを構築
→PCI DSS審査合格
AWSのみでクレジット決済の
インフラを構築
→PCI DSS 審査合格
AWSのみでクレジット決済の
インフラを構築
→PCI DSS審査合格
PCI DSS 環境構築用
CFn テンプレート
https://github.com/suz-lab/suz-lab-cloudformation/blob/
master/pattern/suz-lab_0302_admin_firewall.json
PCI DSS要件
要件1: カード会員データを保護するために、ファイアウォールをインストールして構成を維持する
要件2: システムパスワードおよび他のセキュリティパラメータにベンダ提供のデフォルト値を使用しな
い
要件3: 保存されるカード会員データを保護する
要件4: オープンな公共ネットワーク経由でカード会員データを伝送する場合、暗号化する
要件5: アンチウィルスソフトウェアまたはプログラムを使用し、定期的に更新する
要件6: 安全性の高いシステムとアプリケーションを開発し、保守する
要件7: カード会員データへのアクセスを、業務上必要な範囲内に制限する
要件8: コンピュータにアクセスできる各ユーザに一意の ID を割り当てる
要件9: カード会員データへの物理アクセスを制限する
要件10: ネットワークリソースおよびカード会員データへのすべてのアクセスを追跡および監視する
要件11: セキュリティシステムおよびプロセスを定期的にテストする
要件12: すべての担当者の情報セキュリティポリシーを整備する
脆弱性対策
ミドルウェア最新化
Apacheはパッケージでは不可だったため、最新版ソー
スをコンパイル
• IPA(独立行政法人 情報処理推進機構)の定めるCVSS 4.0以上(レベ
ルIII危険+レベルII警告)はすべて対策必須のため
まとめ
データとシステムの保全方法は別々に考
える→システムの保全は
CloudFormation+AMI で可能
「誰でも」「再現性の高い」インフラ
の構築が可能
Bootstrap 処理を煩雑にしないため
に、AMI化およびバージョン管理が重要
アプリケーション管理サービス
AWS CloudFormation
テンプレートベースで柔軟な設定
AWS Elastic Beanstalk
Webアプリケーション向け
障害の起きたEC2を自動復旧
ELBのURLを入替えて環境の切替が瞬時にできる
AWS OpsWorks
Chef(0.9)レシピベース
RDS 未対応
Thanks!
http://www.cloudpack.jp/
suuport@cloudpack.jp
@cloudpack_jp

BCPに活かせ!一撃 CloudFormation