Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ゼロからはじめる Infrastructure as Code ~SIer企業がAWSで⾃社W...
Search
Hironori Yokoyama
March 14, 2020
Technology
8.3k
0
Share
ゼロからはじめる Infrastructure as Code ~SIer企業がAWSで⾃社Webサービスを⽴ち上げて2年間運⽤してきた話~ / Infrastructure as code starting from scratch
JAWS DAYS 2020のオンライン登壇で使用した発表資料です。
Hironori Yokoyama
March 14, 2020
More Decks by Hironori Yokoyama
See All by Hironori Yokoyama
立ち上げ期のSaaSを支えるAWSの技術 / AWS technology supporting SaaS in its start-up phase
yokoyan
0
350
Cognito+API Gateway+Lambda+S3ではじめるサーバーレスアプリ構築 / Building Serverless Apps with Cognito+API Gateway+Lambda+S3
yokoyan
0
2.8k
【DevRel Meetup in Tokyo #51】社内コミュニティを1年間続けて学んだこと~1人からはじめるDevRel~ / DevRel starting with one person
yokoyan
0
880
SIer企業が Ruby で成長する自社 Web サービスをリリースするまでの失敗と成功の道のり
yokoyan
3
1.9k
Other Decks in Technology
See All in Technology
大学職員のための生成AI最前線 :最前線を、AIガバナンスとして読み直すためのTips
gmoriki
2
4k
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.5k
Gaussian Splattingの表現力を拡張する — 高周波再構成とインタラクションへのアプローチ —
gpuunite_official
0
170
AI飲み会幹事エージェントを作っただけなのに
ykimi
0
200
"うちにはまだ早い"は本当? ─ 小さく始めるPlatform Engineering入門
harukasakihara
6
560
20260515 ID管理は会社を守る大切な砦!〜🔰情シス向け〜
oidfj
0
350
20260513_生成AIを専属DSに_AI分析結果の検品テクニック_ハンズオン_交通事故データ
doradora09
PRO
0
220
freeeで運用しているAIQAについて
qatonchan
1
590
いつの間にかデータエンジニア以外の業務も増えていたけど、意外と経験が役に立ってる
zozotech
PRO
0
570
オライリーイベント登壇資料「鉄リサイクル・産廃業界におけるAI技術実応用のカタチ」
takarasawa_
0
400
(きっとたぶん)人材育成や教育のような何かの話
sejima
0
740
AIエージェントの支払い基盤 AgentCore Payments概要
kmiya84377
2
180
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.1k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
How to build a perfect <img>
jonoalderson
1
5.5k
The Cost Of JavaScript in 2023
addyosmani
55
9.9k
Writing Fast Ruby
sferik
630
63k
Music & Morning Musume
bryan
47
7.2k
Unsuck your backbone
ammeep
672
58k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
250
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Embracing the Ebb and Flow
colly
88
5k
Transcript
JAWS DAYS 2020 ゼロからはじめる Infrastructure as Code ~SIer企業がAWSで⾃社Webサービスを⽴ち上げて2年間運⽤してきた話~ 株式会社システムインテグレータ 製品企画室
横⼭ 弘典
横⼭ 弘典 (@yokoyantech) (株)システムインテグレータ TOPSIC開発リーダー コミュニティ JAWS UG Saitama Saitama.rb
好きなAWSサービス CloudFormation 2
3
JAWS DAYS 初登壇 4
本⽇お伝えしたいこと 5
インフラのコード化は簡単になった︕ ぜひ挑戦してみてください 6
(株)システムインテグレータ さいたま市 東証⼀部 創業24年⽬ 事業内容 ⾃社パッケージソフト 企画、開発 カスタマイズ WEBサービス 開発、運営
7
8
9
10
AtCoder社による問題作成 国内最⼤の競技プログラミングコンテンストの開催企業 11
本⽇はTOPSICの運⽤で 培った体験談をお伝えします 12
ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける
4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 13
何はともあれ 最初は⼿動で構築 14
15
作業ログは⼿順書 みんな⼤好きEXCEL管理 16
課題 画⾯キャプチャがすぐ古くなる 当時存在しなかった設定項⽬なども いちいち張り替えるのは⾯倒 スマートじゃない 再現性が作業者に依存する 17
その後順調にビジネスが成⻑ 18
プロモーションも兼ねて プログラミングコンテストを開催 19
20
21
絶対成功させるために 専⽤環境を構築することに 22
その他要望 TOPSIC Organizationsと組み合わせて環境毎にアカウントを分けたい staging production TOPSIC のAWS環境を流⽤して新製品を作ることに ビジネスの横展開 23
ゼロから⼿作業で 環境構築やり直しは⾟い 24
そこで Infrastructure as Code (以下、IaC) 25
AWS環境を JSON や YAML で 記述してテンプレート化 構成管理、修正、再利⽤が 容易 テンプレートで作成された リソースをスタックと呼ぶ
スタック単位でリソース 管理できる 26
ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける
4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 27
IaCのメリット 冪等性 インフラのコードレビュー 再利⽤が簡単 全て git で管理できる GitOps 信頼できる唯⼀の情報 源とする
変更の承認はPull Requestで⾏う 28
とはいえ、 何から始めたらいいのか わからない 29
私達が最初にやったこと 30
既存環境からのリバース 31
32
Cloud Formerとは AWS純正のツール 既存のAWS環境のリソース情報からCloudFormationテンプレート を⾃動で作成してくれるツール AWS CloudFormation スタックで提供されている なぜか8年くらいずっとβ版 33
クラスメソッドさんブログより [レポート]What’s New in AWS CloudFormation #reinvent #DOP408 https://dev.classmethod.jp/cloud/aws/cloud-formation-dop408/ Q:
永遠にベータのCloudFormerはいつアップデートされるんです か︖ A: よく聞いてくれたね笑 残念ながらCloudFormarがこれからア ップデートされることはありません。サードパーティ製の Former2というWebベースのサービスがあるのですが、これが⾮ 常によくできているのでそれを使ってください。 “ “ 34
今からIaCやるなら Former2がよさそう 35
36
Former2とは サードパーティ製のWEBツール AWS JavaScript SDKを使⽤ インフラ全体をスキャンし、リソースのリストを⽣成する AWSアカウント内の既存のリソースからコード出⼒ができる アウトプット形式 CloudFormation Terraform
Troposphere 37
事前準備 38
画⾯起動 https://former2.com/ にアクセス 39
1.Introduction ブラウザ拡張をインストール Chromeウェブストアを表⽰ ⼀部のAWSサービスでは必要ありませんが、すべてのAWSサ ービスをサポートするには、Former2 Helperブラウザー拡張機 能をインストールする必要があります。 “ “ 40
2.Credentials ReadOnlyAccess のIAMRole、もしくはIAMユーザを⽤意 41
アクセスキー、シークレットキーを⼊⼒ 42
3.Parameters 独⾃のCloudFormationのスタックパラメータ設定できる デフォルト値が設定されている場合は、CloudFormationの組み込 み関数 !Ref 、 !Sub で使⽤できる 43
4.Settings アカウントに対するスキャンなどを⾏う 44
【実践】 EC2のコードを出⼒する 45
Former2の⼀覧からEC2を選択 46
検索しても何も表⽰されないときは AWSあるある キーが違う、リージョンが違う 47
出⼒したいインスタンスを選択 出⼒したいインスタンスにチェックを⼊れて、 Add Selected をク リック 48
ヘッダー部分の Generate ボタンをクリック 49
CloudFormationテンプレートが⾃動⽣成される 50
関連するリソースを出⼒すれば 現状のインフラをコード化できる 51
ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける
4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 52
既存リソースのイン ポート 新機能 2019年11⽉に発表 ⼿動で作成したリソースと CloudFormationテンプレー トを紐づけることができる 53
課題 ⼿動で作ったリソースの CloudFormationテンプレートを作るのが⼤変 54
Former2で解決 55
実践 VPCのコードを出⼒してImport 56
出⼒したテンプレート例(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
事前準備 Former2で出⼒したテンプレートに DeletionPolicy: Retain を追加 インポートするなら必須の設定 スタック削除時にリソースを保持する Resources: EC2VPC: Type:
"AWS::EC2::VPC" DeletionPolicy: Retain # これ Properties: 58
インポート⽅法 マネジメントコンソールからCloudFormationにアクセス スタックの作成をクリック 既存のリソースを使⽤(リソースをインポート) をクリック 59
1.概要をインポート 次へ をクリック 60
2.テンプレートの指定 Former2で出⼒したテンプレートをアップロードする vpcのテンプレートをアップロード 61
3.リソースを識別 既存リソースの VpcId を指定 62
4.スタックの詳細を指定 任意の名前を⼊⼒ 63
5.概要をインポート ⼿動で作成したVPCに対するアクションが、 Import になっている ことを確認して、 リソースをインポート をクリックする 64
インポートが成功していることを確認 65
既存のVPCの確認 VPCダッシュボードを開く タグ タブにて、CloudFormationのタグが付与されるようになる 66
スタックに関連付けたリソースは CloudFormationで変更管理できる 67
気をつけるべきこと いきなりEC2だけインポートすると、循環参照エラーになる リソースの依存と作成の順番を考慮することが⼤事 あるリソースを作成するためには、そのリソースに関連付けるリ ソースを先に作成しておく必要がある 考え⽅はGUI操作と同じ VPC -> SecurityGroup ->
EC2 で依存している 68
ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける
4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 69
インフラを成⻑させる Former2から出⼒したテンプレートは、良くも悪くも現状がそのま ま反映されている 例) リソース同⼠の ID が固定で埋め込まれている そのままでは再利⽤が難しい スタックが⼤きくなりがち 最初は1つの巨⼤なスタックからスタート
70
基本⽅針 AWSのベストプラクティスに従う https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/User practices.html 71
ポイント ⼀つのスタックを⼤きくしすぎない スタックを分割して管理する 作成後ほぼ変更しないもの VPC、Subnet、RouteTable、VPN接続 レイヤー毎に分割 DB層(RDS) Application層(ALB,EC2,SecurityGroup) 72
【実践】 スタックを分割する 73
スタック1 VPC,Subnet,RouteTable作成 74
75
[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
[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
[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
スタック2 NAT,VPN作成 79
80
[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
スタック3 DB層の作成 82
83
[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
スタック4 Application層の作成 85
86
[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
スタックを分割することで 別環境に再利⽤ できる 88
ゼロからはじめる Infrastructure as Code 1. AWS環境を構築する 2. 現状のインフラをコード化する 3. 既存リソースと紐付ける
4. インフラを成⻑させる 5. 2年間の運⽤で得られたもの 89
2年間の運⽤で得られたもの Git にすべてのリソースがあるという安⼼感 変更点の履歴が追えるようになった 属⼈的な作業がPull Requestでレビューできるようになった Excel等の⼿順書を全く作らなくなった 必要な時だけ作って壊すという考え⽅にシフトした これまではもったいないからとりあえず停⽌しておくだった AWSがもっと好きになった
インフラのコード化は楽しい︕ 90
本⽇お伝えしたいこと 91
インフラのコード化は簡単になった︕ ぜひ挑戦してみてください 92
93