Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
44
20250723_Conohaウェビナー_高騰する海外クラウド費用を劇的カット_サーバーコスト最適化のポイント解説と成功事例のご紹介.pdf
nezumisannn
0
66
20241204_ビヨンド勉強会_44_AWS_Service_Catalogを利用したIaCのテンプレート化とTerraformによるデプロイ.pdf
nezumisannn
0
430
20240828_ビヨンド勉強会_42_EKS_on_FargateでWebサービスを公開するために覚えておきたいこと.pdf
nezumisannn
0
120
20240530_ビヨンド勉強会#41_ビヨンドのエンジニア新卒研修における取り組み
nezumisannn
0
140
20230511_AWSにおけるコンテナサービスの選択とIaC実装例.pdf
nezumisannn
0
1.5k
リーダーになって1年経過して_取り組んできたことと大事にしている考え方_の裏側_.pdf
nezumisannn
0
96
20211118_GKEにおける高負荷時のPodとWorker_Nodeの挙動について.pdf
nezumisannn
0
190
20211014_Alibaba_Cloud_Container_Service_for_KubernetesにおけるServerless_Kubernetesの概要とManaged_Kubernetesとの違い.pdf
nezumisannn
0
120
Other Decks in Technology
See All in Technology
渡米前の準備を制す!re:Invent 2026徹底準備術 / The Ultimate Preparation Guide for re:Invent 2026
yuj1osm
1
440
【Oracle AI SPOTLIGHT ウェビナー】事例から見る!なぜOCIが選ばれたのか ― AI時代のクラウド戦略を紐解く ―
oracle4engineer
PRO
1
140
キヨさん67歳 AIコーディングエージェント物語
happysamurai294
0
140
ポケモン対戦を自動で記録して振り返ろう
fufufukakaka
0
420
Vibe-to-Spec開発_実践ガイド
happysamurai294
0
130
Microsoft のサポート ライフサイクルを理解する
murachiakira
PRO
0
240
推論基盤と Scale-Up Interconnect の現状と制約から俯瞰する技術動向
markunet
2
670
あなたのDartコードは丸見えかもしれない ~reFlutterで暴くFlutterアプリの中身と多層防御~
zozotech
PRO
0
710
AI Search (Foundry IQ) におけるRAGデータの準備と配置
ryomaru0825
1
100
国際カードブランドルール変更に伴うクレジットカード決済取引仕様変更について
k1style
0
270
Agent 活用環境の構築・運用のための AWS サービスのご紹介/agentcore-for-building-and-operating-agents
ren8k
1
280
ビジネス部門からPOを迎えての半年間の進歩と課題
zozotech
PRO
0
170
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
6.2k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.9k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
650
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
How to make the Groovebox
asonas
2
2.5k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Facilitating Awesome Meetings
lara
57
7.2k
Design in an AI World
tapps
1
370
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.3k
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はいいぞ! • とハッシュタグ付きでツイートしてみてください(いいねします)
終わり