Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
20200522_FGDC_Terraform_CloudでGitOpsを使用したCI_CDパイプラインを構築する.pdf
nezumisannn
May 22, 2020
Technology
0
300
20200522_FGDC_Terraform_CloudでGitOpsを使用したCI_CDパイプラインを構築する.pdf
nezumisannn
May 22, 2020
Tweet
Share
More Decks by nezumisannn
See All by nezumisannn
リーダーになって1年経過して_取り組んできたことと大事にしている考え方_の裏側_.pdf
nezumisannn
0
20
20211118_GKEにおける高負荷時のPodとWorker_Nodeの挙動について.pdf
nezumisannn
0
15
20211014_Alibaba_Cloud_Container_Service_for_KubernetesにおけるServerless_Kubernetesの概要とManaged_Kubernetesとの違い.pdf
nezumisannn
0
16
20211008_ApsaraDB_for_PolarDBとAWS_Auroraの機能比較.pdf
nezumisannn
1
12
20210122_AlibabaCloudパートナーサミット_Terraform_Cloudを活用するマルチクラウドオートメーション.pdf
nezumisannn
0
3
20201203_AlibabaCloudセミナー_ApsaraDB_for_PolarDB_の便利機能と競合DBとの差別化ポイントの紹介.pdf
nezumisannn
0
1
20200617_ビヨンド勉強会_24_Terraformにおけるディレクトリ構造のプラクティスと記述事例.pdf
nezumisannn
0
190
20200208_GCPUG_NARA__5_SpinnakerとGKEを使用した継続的デリバリーパイプライン.pdf
nezumisannn
0
200
20200129_ビヨンド勉強会__22_関西の駆け出しDocker職人に贈るコンテナサマリー.pdf
nezumisannn
0
670
Other Decks in Technology
See All in Technology
⚡Lightdashを試してみた
k_data_analyst
0
220
アルプの 認証/認可分離戦略と手法
ma2k8
PRO
2
350
YAMLを書くだけで構築できる分散ストレージ
sat
PRO
0
200
事業の成長と共に歩む、ABEMA SRE探求の歴史 / SRE-Next 2022
nagaa052
0
420
Embedded SRE at Mercari
tcnksm
0
860
プロダクトの理想と現実はなぜ乖離しがち?プロダクト作りに潜む問題を考える
suzukentaro
0
200
Devに力を授けたいSREのあゆみ / SRE that wants to empower developers
tocyuki
3
480
LINEのData Platform室が実践する大規模分散環境のCapacity Planning
line_developers
PRO
0
710
THETA Xの登場はジオ業界を変えるか?
furuhashilab
0
170
CAMのサービス開発の歴史と共通基盤を使った 開発スタイルへの変遷について
ishikawa_pro
0
110
Dagu | オンプレ向けワークフローエンジン(WebUI 同梱)
yohamta
0
200
VFX Graphを使って 軽率にAudio Visualizerを作る
drumath2237
0
100
Featured
See All Featured
The Cult of Friendly URLs
andyhume
68
4.7k
How To Stay Up To Date on Web Technology
chriscoyier
780
250k
How to Ace a Technical Interview
jacobian
265
21k
Mobile First: as difficult as doing things right
swwweet
212
7.5k
Embracing the Ebb and Flow
colly
73
3.3k
GraphQLの誤解/rethinking-graphql
sonatard
24
6.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
14
35k
Creatively Recalculating Your Daily Design Routine
revolveconf
207
10k
Rebuilding a faster, lazier Slack
samanthasiow
62
7.2k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
498
130k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
37
3.2k
GitHub's CSS Performance
jonrohan
1020
410k
Transcript
Terraform Cloudを利用した GitOps CI/CDパイプライン FGDC #1 2020/05/22 株式会社ビヨンド 寺岡 佑樹
自己紹介 resource “my_profile” “nezumisannn” { name = “Yuki.Teraoka” nickname =
“ねずみさん家。” company = “beyond Co., Ltd.” job = “Site Reliability Engineer” twitter = “@yktr_sre” skills = [“Terraform”,”Packer”] }
LB APP DB
LB APP DB
Environment Production
Follower Environment Production
QA Team Environment QA
ここで起こり得る問題点 • 構築した人しか構成を把握していない ◦ 認識の齟齬が発生 ◦ 参照していた手順書が古い • 影響範囲が不明瞭のため構成変更が怖い ◦
設定変更したら動かなくなった ◦ 本番環境でダウンタイムが発生してしまった • どのような手順を踏めば良いのかがわからない ◦ 手順が形として残っていないので参考にできない ◦ 設定変更前の検証に時間がかかる ◦ 開発効率とリリーススピードの低下
Infrastructure as Code • インフラの構成をコードとして記述すること • TerraformもIaCを実現するツールの1つ
Terraform • Hashicorpによって開発されているツール • マルチプロバイダー ◦ AWS / GCP /
Azureなど数々のクラウドサービスの構築を自動化できる ◦ HCL(Hashicorp Configuration Language)と呼ばれる独自言語で記述する resource "aws_instance" "web" { count = 1 ami = "ami-04560ec17deca7cc2" instance_type = "t3.micro" subnet_id = element(local.dmz_subnet_ids, count.index) key_name = data.terraform_remote_state.mng.outputs.key_pair_name vpc_security_group_ids = [ aws_security_group.ec2.id ] }
Infrastructure as Codeの効果 • インフラ構成をコードとしてレビューできるようになる • ソースコードと同じくバージョン管理できるようになる • モジュール化によってコードの再利用ができる ◦
他環境への横展開が容易になる
Environment Production
ここで起こり得る問題点 • 誰でもデプロイ出来てしまう ◦ デプロイフローの未確立 ◦ Terraformをローカル実行 ◦ オペレーションミスの誘発 •
反映前のレビューが出来ていない ◦ コードの記述ミスに気づけない
CI/CD • アプリケーション開発のビルド/テスト/デプロイを自動化する手法 • インフラもIaCと組み合わせることでCI/CDの恩恵を得ることができる
Terraform Cloud • チームでのTerraformの実行を補助するアプリケーション ◦ 一貫した信頼性の高い Terraformの実行環境 ◦ 状態ファイル(tfstate)やアクセスキーなどのシークレットの共有 ◦
インフラストラクチャへの変更を承認するためのアクセス制御 ◦ Terraformのモジュールを共有するためのプライベートレポジトリ ◦ Terraformの構成内容を管理するためのポリシー制御
CI/CDの効果 • 構築及びデプロイフローを全メンバーで共通化することができる ◦ コードレビューの徹底 ◦ オペミスの防止 ◦ 新規メンバーの参入障壁を減らす •
手動から自動に変わることでリリーススピードが向上する
実装例 • Terraform Cloudを利用した実装例をご紹介します • 詳細は以下のブログにも記載しています • https://beyondjapan.com/blog/2020/04/terraform-cloud-gitops-cicd/
None
• SREがTerraformのモジュールを記述してGitLabにPush • Team AとTeam Bのメンバーが利用する
$ tree . ├── README.md ├── examples │ └── vpc
│ ├── main.tf │ ├── outputs.tf │ ├── provider.tf │ ├── terraform.tfstate │ ├── terraform.tfstate.backup │ ├── terraform.tfvars │ └── variables.tf ├── main.tf ├── outputs.tf └── variables.tf 2 directories, 11 files ディレクトリ構造 モジュール本体 サンプルコード
モジュール本体 引数の型定義 リソース定義 variable "vpc_config" { description = "VPC Config"
type = object({ name = string cidr_block = string enable_dns_support = bool enable_dns_hostnames = bool }) default = { name = "" cidr_block = "" enable_dns_support = false enable_dns_hostnames = false } } resource "aws_vpc" "vpc" { cidr_block = var.vpc_config.cidr_block enable_dns_support = var.vpc_config.enable_dns_support enable_dns_hostnames = var.vpc_config.enable_dns_hostnames tags = { Name = var.vpc_config.name } }
サンプルコード モジュール定義 変数定義 $ git tag v1.0.0 $ git push
origin v1.0.0 変数代入(tfvars) module "vpc" { source = "../../" vpc_config = { name = "vpc-${var.project}-${var.environment}" cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true } public_subnet_config = { name = "subnet-${var.project}-${var.environment}-public" route_table_name = "route-${var.project}-${var.environment}-public" internet_gateway_name = "igw-${var.project}-${var.environment}" subnets = { ap-northeast-1a = "10.0.10.0/24" ap-northeast-1c = "10.0.11.0/24" ap-northeast-1d = "10.0.12.0/24" } ~~~~ SNIP ~~~~ } variable "project" { description = "Project Name" } variable "environment" { description = "Environment" } project = "terraform-vpc-module" environment = "prod"
• GitLabにPushしたモジュールをPrivate Module Registryにインポートする
引数定義 リソース一覧
• Terraform CloudにWorkSpaceを作成する • Terraformのコードで記述された構成を PRJごとやサービスごとなど意味のある単位に分割するための論理グループ
ワークスペース
• Teamごとに作成したいインフラの構成をTerraformで記述する • SREsが記述したモジュールを利用する
$ tree . ├── backend.tf ├── main.tf ├── outputs.tf ├──
providers.tf └── variables.tf 0 directories, 5 files ディレクトリ構造
変数定義 • 引数として渡す値を格納する変数を定義 • 定義のみ行い代入はローカルで行わない ##################### # Project ##################### variable
"project" { description = "Project Name" } variable "environment" { description = "Environment" } ##################### # AWS Common ##################### variable "access_key" { description = "AWS Access Key" } variable "secret_key" { description = "AWS Secret Key" } variable "role_arn" { description = "AWS Role ARN for Assume Role" } variable "region" { description = "AWS Region" }
変数代入 • Terraform Cloudで変数を代入 • シークレットはSensitive Valueにする
tfstate ステート管理 • ローカルで管理しない • remote-backendの記述を行う • WorkSpaceを指定してTerraform Cloudで管理する terraform
{ backend "remote" { hostname = "app.terraform.io" organization = "Org-Name" workspaces { prefix = "team_b_prj_b_prod" } } }
モジュール定義 • Private Module Registryのモジュールを指定 • 利用したいバージョンを指定 module "vpc" {
source = "app.terraform.io/Org-Name/module-vpc/aws" version = "1.0.0" vpc_config = { name = "vpc-${var.project}-${var.environment }" cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true } public_subnet_config = { name = "subnet-${var.project}-${var.environment }-public" route_table_name = "route-${var.project}-${var.environment }-public" internet_gateway_name = "igw-${var.project}-${var.environment }" subnets = { ap-northeast-1a = "10.0.10.0/24" ap-northeast-1c = "10.0.11.0/24" ap-northeast-1d = "10.0.12.0/24" } }
• WorkSpaceに各Teamのリポジトリを登録する • GitへのPushをトリガーにterraform planが自動実行される
リポジトリ登録 ファイル読込 リポジトリ選択
module "vpc" { source = "app.terraform.io/Org-Name/module-vpc/aws" version = "1.0.0" vpc_config
= { name = "vpc-${var.project}-${var.environment }" cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true } public_subnet_config = { name = "subnet-${var.project}-${var.environment }-public" route_table_name = "route-${var.project}-${var.environment }-public" internet_gateway_name = "igw-${var.project}-${var.environment }" subnets = { ap-northeast-1a = "10.0.10.0/24" ap-northeast-1c = "10.0.11.0/24" ap-northeast-1d = "10.0.12.0/24" } } コード変更 "subnet-${var.project}-${var.environment }-pub"
自動Plan
• Planの結果を元にレビューを行う • 意図した内容であれば Applyを承認する
承認後Apply
• Applyするとtfstateが更新される
tfstate
• Terraform Cloudの動作状況が通知される
Slack通知 • PlanとApply時に通知される • 他のメンバーもデプロイ状況を把握できる
まとめ • Terraformはいいぞ! • とハッシュタグ付きでツイートしてみてください(いいねします)
終わり