Slide 1

Slide 1 text

JAWS DAYS 2020 ゼロからはじめる Infrastructure as Code ~SIer企業がAWSで⾃社Webサービスを⽴ち上げて2年間運⽤してきた話~ 株式会社システムインテグレータ 製品企画室 横⼭ 弘典

Slide 2

Slide 2 text

横⼭ 弘典 (@yokoyantech) (株)システムインテグレータ TOPSIC開発リーダー コミュニティ JAWS UG Saitama Saitama.rb 好きなAWSサービス CloudFormation 2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

JAWS DAYS 初登壇 4

Slide 5

Slide 5 text

本⽇お伝えしたいこと 5

Slide 6

Slide 6 text

インフラのコード化は簡単になった︕ ぜひ挑戦してみてください 6

Slide 7

Slide 7 text

(株)システムインテグレータ さいたま市 東証⼀部 創業24年⽬ 事業内容 ⾃社パッケージソフト 企画、開発 カスタマイズ WEBサービス 開発、運営 7

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

9

Slide 10

Slide 10 text

10

Slide 11

Slide 11 text

AtCoder社による問題作成 国内最⼤の競技プログラミングコンテンストの開催企業 11

Slide 12

Slide 12 text

本⽇はTOPSICの運⽤で 培った体験談をお伝えします 12

Slide 13

Slide 13 text

ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける 4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 13

Slide 14

Slide 14 text

何はともあれ 最初は⼿動で構築 14

Slide 15

Slide 15 text

15

Slide 16

Slide 16 text

作業ログは⼿順書 みんな⼤好きEXCEL管理 16

Slide 17

Slide 17 text

課題 画⾯キャプチャがすぐ古くなる 当時存在しなかった設定項⽬なども いちいち張り替えるのは⾯倒 スマートじゃない 再現性が作業者に依存する 17

Slide 18

Slide 18 text

その後順調にビジネスが成⻑ 18

Slide 19

Slide 19 text

プロモーションも兼ねて プログラミングコンテストを開催 19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

21

Slide 22

Slide 22 text

絶対成功させるために 専⽤環境を構築することに 22

Slide 23

Slide 23 text

その他要望 TOPSIC Organizationsと組み合わせて環境毎にアカウントを分けたい staging production TOPSIC のAWS環境を流⽤して新製品を作ることに ビジネスの横展開 23

Slide 24

Slide 24 text

ゼロから⼿作業で 環境構築やり直しは⾟い 24

Slide 25

Slide 25 text

そこで Infrastructure as Code (以下、IaC) 25

Slide 26

Slide 26 text

AWS環境を JSON や YAML で 記述してテンプレート化 構成管理、修正、再利⽤が 容易 テンプレートで作成された リソースをスタックと呼ぶ スタック単位でリソース 管理できる 26

Slide 27

Slide 27 text

ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける 4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 27

Slide 28

Slide 28 text

IaCのメリット 冪等性 インフラのコードレビュー 再利⽤が簡単 全て git で管理できる GitOps 信頼できる唯⼀の情報 源とする 変更の承認はPull Requestで⾏う 28

Slide 29

Slide 29 text

とはいえ、 何から始めたらいいのか わからない 29

Slide 30

Slide 30 text

私達が最初にやったこと 30

Slide 31

Slide 31 text

既存環境からのリバース 31

Slide 32

Slide 32 text

32

Slide 33

Slide 33 text

Cloud Formerとは AWS純正のツール 既存のAWS環境のリソース情報からCloudFormationテンプレート を⾃動で作成してくれるツール AWS CloudFormation スタックで提供されている なぜか8年くらいずっとβ版 33

Slide 34

Slide 34 text

クラスメソッドさんブログより [レポート]What’s New in AWS CloudFormation #reinvent #DOP408 https://dev.classmethod.jp/cloud/aws/cloud-formation-dop408/ Q: 永遠にベータのCloudFormerはいつアップデートされるんです か︖ A: よく聞いてくれたね笑 残念ながらCloudFormarがこれからア ップデートされることはありません。サードパーティ製の Former2というWebベースのサービスがあるのですが、これが⾮ 常によくできているのでそれを使ってください。 “ “ 34

Slide 35

Slide 35 text

今からIaCやるなら Former2がよさそう 35

Slide 36

Slide 36 text

36

Slide 37

Slide 37 text

Former2とは サードパーティ製のWEBツール AWS JavaScript SDKを使⽤ インフラ全体をスキャンし、リソースのリストを⽣成する AWSアカウント内の既存のリソースからコード出⼒ができる アウトプット形式 CloudFormation Terraform Troposphere 37

Slide 38

Slide 38 text

事前準備 38

Slide 39

Slide 39 text

画⾯起動 https://former2.com/ にアクセス 39

Slide 40

Slide 40 text

1.Introduction ブラウザ拡張をインストール Chromeウェブストアを表⽰ ⼀部のAWSサービスでは必要ありませんが、すべてのAWSサ ービスをサポートするには、Former2 Helperブラウザー拡張機 能をインストールする必要があります。 “ “ 40

Slide 41

Slide 41 text

2.Credentials ReadOnlyAccess のIAMRole、もしくはIAMユーザを⽤意 41

Slide 42

Slide 42 text

アクセスキー、シークレットキーを⼊⼒ 42

Slide 43

Slide 43 text

3.Parameters 独⾃のCloudFormationのスタックパラメータ設定できる デフォルト値が設定されている場合は、CloudFormationの組み込 み関数 !Ref 、 !Sub で使⽤できる 43

Slide 44

Slide 44 text

4.Settings アカウントに対するスキャンなどを⾏う 44

Slide 45

Slide 45 text

【実践】 EC2のコードを出⼒する 45

Slide 46

Slide 46 text

Former2の⼀覧からEC2を選択 46

Slide 47

Slide 47 text

検索しても何も表⽰されないときは AWSあるある キーが違う、リージョンが違う 47

Slide 48

Slide 48 text

出⼒したいインスタンスを選択 出⼒したいインスタンスにチェックを⼊れて、 Add Selected をク リック 48

Slide 49

Slide 49 text

ヘッダー部分の Generate ボタンをクリック 49

Slide 50

Slide 50 text

CloudFormationテンプレートが⾃動⽣成される 50

Slide 51

Slide 51 text

関連するリソースを出⼒すれば 現状のインフラをコード化できる 51

Slide 52

Slide 52 text

ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける 4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 52

Slide 53

Slide 53 text

既存リソースのイン ポート 新機能 2019年11⽉に発表 ⼿動で作成したリソースと CloudFormationテンプレー トを紐づけることができる 53

Slide 54

Slide 54 text

課題 ⼿動で作ったリソースの CloudFormationテンプレートを作るのが⼤変 54

Slide 55

Slide 55 text

Former2で解決 55

Slide 56

Slide 56 text

実践 VPCのコードを出⼒してImport 56

Slide 57

Slide 57 text

出⼒したテンプレート例(vpc.yml) AWSTemplateFormatVersion: "2010-09-09" Metadata: Generator: "former2" Description: "" Resources: EC2VPC: Type: "AWS::EC2::VPC" Properties: CidrBlock: "10.0.0.0/16" EnableDnsSupport: true EnableDnsHostnames: true InstanceTenancy: "default" Tags: - Key: "Name" Value: "stage" 57

Slide 58

Slide 58 text

事前準備 Former2で出⼒したテンプレートに DeletionPolicy: Retain を追加 インポートするなら必須の設定 スタック削除時にリソースを保持する Resources: EC2VPC: Type: "AWS::EC2::VPC" DeletionPolicy: Retain # これ Properties: 58

Slide 59

Slide 59 text

インポート⽅法 マネジメントコンソールからCloudFormationにアクセス スタックの作成をクリック 既存のリソースを使⽤(リソースをインポート) をクリック 59

Slide 60

Slide 60 text

1.概要をインポート 次へ をクリック 60

Slide 61

Slide 61 text

2.テンプレートの指定 Former2で出⼒したテンプレートをアップロードする vpcのテンプレートをアップロード 61

Slide 62

Slide 62 text

3.リソースを識別 既存リソースの VpcId を指定 62

Slide 63

Slide 63 text

4.スタックの詳細を指定 任意の名前を⼊⼒ 63

Slide 64

Slide 64 text

5.概要をインポート ⼿動で作成したVPCに対するアクションが、 Import になっている ことを確認して、 リソースをインポート をクリックする 64

Slide 65

Slide 65 text

インポートが成功していることを確認 65

Slide 66

Slide 66 text

既存のVPCの確認 VPCダッシュボードを開く タグ タブにて、CloudFormationのタグが付与されるようになる 66

Slide 67

Slide 67 text

スタックに関連付けたリソースは CloudFormationで変更管理できる 67

Slide 68

Slide 68 text

気をつけるべきこと いきなりEC2だけインポートすると、循環参照エラーになる リソースの依存と作成の順番を考慮することが⼤事 あるリソースを作成するためには、そのリソースに関連付けるリ ソースを先に作成しておく必要がある 考え⽅はGUI操作と同じ VPC -> SecurityGroup -> EC2 で依存している 68

Slide 69

Slide 69 text

ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける 4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 69

Slide 70

Slide 70 text

インフラを成⻑させる Former2から出⼒したテンプレートは、良くも悪くも現状がそのま ま反映されている 例) リソース同⼠の ID が固定で埋め込まれている そのままでは再利⽤が難しい スタックが⼤きくなりがち 最初は1つの巨⼤なスタックからスタート 70

Slide 71

Slide 71 text

基本⽅針 AWSのベストプラクティスに従う https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/User practices.html 71

Slide 72

Slide 72 text

ポイント ⼀つのスタックを⼤きくしすぎない スタックを分割して管理する 作成後ほぼ変更しないもの VPC、Subnet、RouteTable、VPN接続 レイヤー毎に分割 DB層(RDS) Application層(ALB,EC2,SecurityGroup) 72

Slide 73

Slide 73 text

【実践】 スタックを分割する 73

Slide 74

Slide 74 text

スタック1 VPC,Subnet,RouteTable作成 74

Slide 75

Slide 75 text

75

Slide 76

Slide 76 text

[Tips] 複数の環境に対応させる Parameters でスタック実⾏時の引数として受け取り変数化する CloudFormationの組み込み関数 !Sub を使⽤する Parameters: ENV: Type: String # 例: "staging" Resources: VPC: Type: 'AWS::EC2::VPC' Properties: Tags: - Key: Name Value: !Sub "${ENV}-vpc" # staging-vpc 76

Slide 77

Slide 77 text

[Tips] テンプレートに固有のIDをベタ書きしない CloudFormationの組み込み関数 !Ref を使⽤する テンプレート内のリソースの値を返す Parameters: VPCCIDR: Type: String # 例: "10.0.0.0/16" Resources: VPC: Type: 'AWS::EC2::VPC' Properties: CidrBlock: !Ref VPCCIDR # 10.0.0.0/16 77

Slide 78

Slide 78 text

[Tips] 作成したリソース名を出⼒する Outputs で出⼒して、クロススタック参照できるようにする 他のスタックから Name を指定すると Value を参照可能 Outputs: VPC: Value: !Ref VPC Export: Name: !Sub "${ENV}-VPC" # staging-vpc VPCCIDR: Value: !Ref VPCCIDR # 10.0.0.0/16 Export: Name: !Sub "${ENV}-VPCCIDR" # staging-VPCCIDR 78

Slide 79

Slide 79 text

スタック2 NAT,VPN作成 79

Slide 80

Slide 80 text

80

Slide 81

Slide 81 text

[Tips] クロススタック参照を使う Outputs: PublicSubnet1c: Value: !Ref PublicSubnet1c Export: Name: !Sub "${ENV}-PublicSubnet1c" # staging-PublicSubnet1c Fn::ImportValue 関数で、別スタックから Outputs の Value を参照 Resources: NATGateway1c: Type: AWS::EC2::NatGateway Properties: SubnetId: Fn::ImportValue: !Sub "${ENV}-PublicSubnet1c" # staging-PublicSubnet1c 81

Slide 82

Slide 82 text

スタック3 DB層の作成 82

Slide 83

Slide 83 text

83

Slide 84

Slide 84 text

[Tips] DBのパラメータもコード化 RDSの設定を容易にする バックアップのポリシー、パラメータグループ、MultiAZ等 rds: Type: 'AWS::RDS::DBInstance' Properties: AllocatedStorage: '20' DBInstanceClass: db.t3.micro BackupRetentionPeriod: 14 PreferredBackupWindow: '19:00-19:30' PreferredMaintenanceWindow: 'sun:18:00-sun:18:30' DBInstanceIdentifier: !Sub "${ENV}-db" # Staging-db MultiAZ: true 84

Slide 85

Slide 85 text

スタック4 Application層の作成 85

Slide 86

Slide 86 text

86

Slide 87

Slide 87 text

[Tips] ⼿動設定が⾯倒なものをコード化 EC2のロール設定 CodeDeployエージェントのインストール Type: 'AWS::IAM::Role' Properties: ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole' - 'arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM' Type: 'AWS::EC2::Instance' Properties: UserData: !Base64 | #! /bin/bash sudo apt-get update -y sudo apt-get install ruby -y sudo apt-get install wget wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install 87

Slide 88

Slide 88 text

スタックを分割することで 別環境に再利⽤ できる 88

Slide 89

Slide 89 text

ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける 4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 89

Slide 90

Slide 90 text

2年間の運⽤で得られたもの Git にすべてのリソースがあるという安⼼感 変更点の履歴が追えるようになった 属⼈的な作業がPull Requestでレビューできるようになった Excel等の⼿順書を全く作らなくなった 必要な時だけ作って壊すという考え⽅にシフトした これまではもったいないからとりあえず停⽌しておくだった AWSがもっと好きになった インフラのコード化は楽しい︕ 90

Slide 91

Slide 91 text

本⽇お伝えしたいこと 91

Slide 92

Slide 92 text

インフラのコード化は簡単になった︕ ぜひ挑戦してみてください 92

Slide 93

Slide 93 text

93