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
20200522_FGDC_Terraform_CloudでGitOpsを使用したCI_CD...
Search
nezumisannn
May 22, 2020
Technology
450
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20200522_FGDC_Terraform_CloudでGitOpsを使用したCI_CDパイプラインを構築する.pdf
nezumisannn
May 22, 2020
More Decks by nezumisannn
See All by nezumisannn
20250930_Conohaウェビナー_生成AI_Terraform_ConoHa_VPSサーバー_セットアップ入門編
nezumisannn
1
38
20250723_Conohaウェビナー_高騰する海外クラウド費用を劇的カット_サーバーコスト最適化のポイント解説と成功事例のご紹介.pdf
nezumisannn
0
57
20241204_ビヨンド勉強会_44_AWS_Service_Catalogを利用したIaCのテンプレート化とTerraformによるデプロイ.pdf
nezumisannn
0
400
20240828_ビヨンド勉強会_42_EKS_on_FargateでWebサービスを公開するために覚えておきたいこと.pdf
nezumisannn
0
110
20240530_ビヨンド勉強会#41_ビヨンドのエンジニア新卒研修における取り組み
nezumisannn
0
140
20230511_AWSにおけるコンテナサービスの選択とIaC実装例.pdf
nezumisannn
0
1.5k
リーダーになって1年経過して_取り組んできたことと大事にしている考え方_の裏側_.pdf
nezumisannn
0
92
20211118_GKEにおける高負荷時のPodとWorker_Nodeの挙動について.pdf
nezumisannn
0
180
20211014_Alibaba_Cloud_Container_Service_for_KubernetesにおけるServerless_Kubernetesの概要とManaged_Kubernetesとの違い.pdf
nezumisannn
0
110
Other Decks in Technology
See All in Technology
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
310
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.3k
変化の早いClaude Codeを 書籍に落とし込む
oikon48
7
1.4k
【CEDEC2026】ゲームシナリオライターを支援するAIツール開発の実践 ― 設計とプロンプトの工夫 ―
cygames
PRO
1
780
Redmine 7.0 新機能・機能強化解説(OSC2026京都ダイジェスト版)
vividtone
1
240
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
210
関東Kaggler会発表資料
takoi
1
210
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
17
7k
その“隠したつもり”が命取り ── 自前と平文をやめて「正解」に委ねる
kuroneko13
0
100
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
240
事業価値と Engineering 2026年度版
recruitengineers
PRO
45
22k
【Google Cloud Next Tokyo'26】Gemini Enterprise と Oracle AI Database で実現する、業務データ活用を実現する AI エージェント実装
shisyu_gaku
0
240
Featured
See All Featured
First, design no harm
axbom
PRO
2
1.2k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
WCS-LA-2024
lcolladotor
0
790
Measuring & Analyzing Core Web Vitals
bluesmoon
9
950
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Context Engineering - Making Every Token Count
addyosmani
9
1k
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
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はいいぞ! • とハッシュタグ付きでツイートしてみてください(いいねします)
終わり