ゼロからはじめる Infrastructure as Code ~SIer企業がAWSで⾃社Webサービスを⽴ち上げて2年間運⽤してきた話~ / Infrastructure as code starting from scratch
by
Hironori Yokoyama
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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