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
Terraformあれやこれ/terraform-this-and-that
Search
emi
April 18, 2024
Technology
10
3.8k
Terraformあれやこれ/terraform-this-and-that
2024/4/19(金)JAWS-UG朝会 #56
https://jawsug-asa.connpass.com/event/312976/
登壇資料です。
emi
April 18, 2024
Tweet
Share
More Decks by emi
See All by emi
2025/1/29 BigData-JAWS 勉強会 #28 (re:Invent 2024 re:Cap)/new-feature-preview-q-in-quicksight-scenarios-tried-and-tested
emiki
0
370
第27回クラウド女子会 ~re:Invent 振り返りLT会~ 私の周辺で反響のあった re:Invent 2024 アップデートつれづれ/reinvent-2024-update-reverberated-around-me
emiki
1
640
DynamoDB でスロットリングが発生したとき/when_throttling_occurs_in_dynamodb_short
emiki
0
700
DynamoDB でスロットリングが発生したとき_大盛りver/when_throttling_occurs_in_dynamodb_long
emiki
1
970
AWS ログ解析のオデッセイ~システムの息遣いを読み解く冒険~/aws-log-analysis-odyssey-deciphering-the-breathing-of-systems
emiki
2
1.5k
何を使って可視化する?AWSでのログ分析/What-do-you-use-to-visualise-it-log-analysis-in-AWS
emiki
2
1.9k
AWS を使う上で知っておきたいオンプレミス知識/aws-on-premise-essentials
emiki
1
5.5k
サーバーのセキュリティ対策とコンテナのセキュリティ対策の違い/hibiyatech_differences-between-server-security-and-container-security
emiki
0
1.7k
FSx for NetApp ONTAP のエンドポイントについて語りたい/hibiyatech1-i-want-to-talk-about-fsx-for-netapp-ontap-endpoints
emiki
0
1.2k
Other Decks in Technology
See All in Technology
『衛星データ利用の方々にとって近いようで触れる機会のなさそうな小話 ~ 衛星搭載ソフトウェアと衛星運用ソフトウェア (実物) を動かしながらわいわいする編 ~』 @日本衛星データコミニティ勉強会
meltingrabbit
0
140
モノレポ開発のエラー、誰が見る?Datadog で実現する適切なトリアージとエスカレーション
biwashi
6
800
Developer Summit 2025 [14-D-1] Yuki Hattori
yuhattor
19
6.1k
2/18/25: Java meets AI: Build LLM-Powered Apps with LangChain4j
edeandrea
PRO
0
110
偶然 × 行動で人生の可能性を広げよう / Serendipity × Action: Discover Your Possibilities
ar_tama
1
1.1k
【Developers Summit 2025】プロダクトエンジニアから学ぶ、 ユーザーにより高い価値を届ける技術
niwatakeru
2
1.3k
2024.02.19 W&B AIエージェントLT会 / AIエージェントが業務を代行するための計画と実行 / Algomatic 宮脇
smiyawaki0820
12
2.9k
明日からできる!技術的負債の返済を加速するための実践ガイド~『ホットペッパービューティー』の事例をもとに~
recruitengineers
PRO
3
380
Amazon S3 Tablesと外部分析基盤連携について / Amazon S3 Tables and External Data Analytics Platform
nttcom
0
130
CZII - CryoET Object Identification 参加振り返り・解法共有
tattaka
0
340
Classmethod AI Talks(CATs) #17 司会進行スライド(2025.02.19) / classmethod-ai-talks-aka-cats_moderator-slides_vol17_2025-02-19
shinyaa31
0
100
インフラをつくるとはどういうことなのか、 あるいはPlatform Engineeringについて
nwiizo
5
2.5k
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
461
33k
Practical Orchestrator
shlominoach
186
10k
Designing for humans not robots
tammielis
250
25k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
550
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Fireside Chat
paigeccino
34
3.2k
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
YesSQL, Process and Tooling at Scale
rocio
172
14k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
Navigating Team Friction
lara
183
15k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
Transcript
Terraform あれやこれ 2024 年 4 月 19 日 JAWS-UG朝会 #56
2 目次 • はじめに • Terraform おさらい • Terraform リソース名?
• Terraform モジュールの話 • Terraform スタイルガイド • その他 Terraform 初級者向け
3 目次 • はじめに • Terraform おさらい • Terraform リソース名?
• Terraform モジュールの話 • Terraform スタイルガイド • その他
4 はじめに
5 はじめに • 普段 AWS リソースを作成する際、 一番よく利用する IaC ツールは何ですか? 1.
CloudFormation 2. Terraform 3. CDK 4. SAM 5. Serverless Framework 6. Pulumi 7. その他
6 はじめに • JAWS DAYS 2024 - LEAP BEYOND •
ぼくのかんがえたさいきょうのAWSへのリソースデプロイ • https://jawsdays2024.jaws-ug.jp/sessions/timetable/C-1/ • https://dev.classmethod.jp/articles/jaws-days-2024-boku-saikyo-aws-deploy/
7 目次 • はじめに • Terraform おさらい • Terraform リソース名?
• Terraform モジュールの話 • Terraform スタイルガイド • その他
8 Terraform おさらい
9 Terraform おさらい • HashiCorp 社が提供する IaC ツール • 様々なプロバイダーのリソースを
HCL という言語で書かれた ソースコードで管理でき、バージョン管理、再利用、共有が可能 • プロバイダーの例: • AWS、Azure、Google Cloud、Kubernetes、Alibaba Cloud、 Olacle Cloud、Docker、Cloudflare、akamai etc…
10 Terraform おさらい • AWS リソースを Terraform でデプロイする場合… • Terraform
を実行するマシンに Terraform をインストールする必要がある • Terraform は AWS CLI の権限を使用して AWS に API を 叩きに行くので AWS CLI のセットアップが必要 AWS Cloud AWS CLI ①手元の開発端末にインストールして ②デプロイ ECS AWS Cloud ECS AWS Cloud9 AWS CLI ②AWS 上のコンピュートサービスにインストールして ②デプロイ
11 Terraform おさらい • 環境が整ったら、ソースコードを書く • Terraform のソースコードは .tf という拡張子で保存する
################################################## # Terraform settings ################################################## terraform { # Terraform バージョンの指定 required_version = "~> 1.4" # AWS プロバイダーのバージョン指定 required_providers { aws = { source = "hashicorp/aws" version = "~> 5.01" } } # tfstate ファイルを S3 に配置する(配置先の S3 は事前に作成しておく) backend s3 { bucket = "tfstate-emikitani" region = "ap-northeast-1" key = "tf-test-20240402.tfstate" } } ################################################## # Provider settings ################################################## # AWS プロバイダーの定義 provider aws { region = "ap-northeast-1" } ################################################## # VPC ################################################## # VPC resource "aws_vpc" "vpc" { cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true tags = { Name = "vpc" } } # Internet Gateway resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.vpc.id tags = { Name = "igw" } } main.tf という名前で保存
12 Terraform おさらい • 環境が整ったら、ソースコードを書く ################################################## # Terraform settings ##################################################
terraform { # Terraform バージョンの指定 required_version = "~> 1.4" # AWS プロバイダーのバージョン指定 required_providers { aws = { source = "hashicorp/aws" version = "~> 5.01" } } # tfstate ファイルを S3 に配置する(配置先の S3 は事前に作成しておく) backend s3 { bucket = "tfstate-emikitani" region = "ap-northeast-1" key = "tf-test-20240402.tfstate" } } ################################################## # Provider settings ################################################## # AWS プロバイダーの定義 provider aws { region = "ap-northeast-1" } ################################################## # VPC ################################################## # VPC resource "aws_vpc" "vpc" { cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true tags = { Name = "vpc" } } # Internet Gateway resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.vpc.id tags = { Name = "igw" } } Terraform の設定 プロバイダーの設定 リソースの作成
13 Terraform おさらい • Terraform の設定 • Terraform は一番最初に Terraform
ブロックを読み込む • Terraform バージョンの指定 (required_version) • Terraform のどのバージョン が必要かを指定 • プロバイダーの指定 (required_providers ) • AWS などのプロバイダーの ソースとバージョンを指定 ################################################## # Terraform settings ################################################## terraform { # Terraform バージョンの指定 required_version = "~> 1.4" # AWS プロバイダーのバージョン指定 required_providers { aws = { source = "hashicorp/aws" version = "~> 5.01" } } # tfstate ファイルを S3 に配置する(配置先の S3 は事前に作成しておく) backend s3 { bucket = "tfstate-emikitani" region = "ap-northeast-1" key = "tf-test-20240402.tfstate" } } https://developer.hashicorp.com/terraform/language/settings https://developer.hashicorp.com/terraform/language/expressions/version-constraints {} で囲まれた部分を 「ブロック」と呼ぶ Terraform にも プロバイダーにも バージョンがある
14 Terraform おさらい • Terraform の設定 • バックエンドの設定 • Terraform
は状態ファイル (tfstate ファイル)で インフラの状態を追跡する • tfstate ファイルをどこに保存 するか指定する • bucket = S3 バケットの名前 • region = S3 バケットが配置 されているリージョン • key = S3 バケット内の状態 ファイルの名前と場所 ################################################## # Terraform settings ################################################## terraform { # Terraform バージョンの指定 required_version = "~> 1.4" # AWS プロバイダーのバージョン指定 required_providers { aws = { source = "hashicorp/aws" version = "~> 5.01" } } # tfstate ファイルを S3 に配置する(配置先の S3 は事前に作成しておく) backend s3 { bucket = "tfstate-emikitani" region = "ap-northeast-1" key = "tf-test-20240402.tfstate" } }
15 Terraform おさらい • プロバイダーの設定 • リージョンの指定(region) • 他、ここでバージョンを指定するこ とも
AWS CLI のプロファイル (profile)を記述することもできる ################################################## # Provider settings ################################################## # AWS プロバイダーの定義 provider aws { region = "ap-northeast-1" } https://registry.terraform.io/providers/hashicorp/aws/latest/docs
16 Terraform おさらい • リソースの作成 • 実際のリソース作成部分 • リソース作成時の基本的な構文 ##################################################
# VPC ################################################## # VPC resource "aws_vpc" "vpc" { cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true tags = { Name = "vpc" } } # Internet Gateway resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.vpc.id tags = { Name = "igw" } } https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/internet_gateway resource "リソースの種類" "リソース名" { 設定項目1 = 値1 設定項目2 = 値2 設定項目3 = 値3 }
17 Terraform おさらい • リソースの作成 • 実際のリソース作成部分 • リソース作成時の基本的な構文 ##################################################
# VPC ################################################## # VPC resource "aws_vpc" "vpc" { cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true tags = { Name = "vpc" } } # Internet Gateway resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.vpc.id tags = { Name = "igw" } } https://developer.hashicorp.com/terraform/language/expressions/references resource "リソースの種類" "リソース名" { 設定項目1 = 値1 設定項目2 = 値2 設定項目3 = 値3 } <RESOURCE TYPE>.<NAME> の形式で リソースを指定する
18 Terraform おさらい • ソースコードができたら、terraform コマンドで リソースをデプロイする • terraform init
環境準備 • ワークスペースの初期化や必要なプラグインのダウンロード • terraform plan 何ができるか確認 • ソースコードに基づいてどのようなリソースが作成、更新、削除されるか表示する • terraform apply リソース作成 • terraform planで提案されたリソースを作成、更新、削除する • コマンド実行時には変更内容が再度確認され、ユーザが変更を承認する必要がある • terraform destroy リソース削除 • Terraformによって管理されているすべてのリソースを削除する
19 目次 • はじめに • Terraform おさらい • Terraform リソース名?
• Terraform モジュールの話 • Terraform スタイルガイド • その他
20 Terraform リソース名?
21 Terraform リソース名? • リソースの作成 • 実際のリソース作成部分 • リソース作成時の基本的な構文 https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/internet_gateway resource "リソースの種類" "リソース名" { 設定項目1 = 値1 設定項目2 = 値2 設定項目3 = 値3 } ################################################## # VPC ################################################## # VPC resource "aws_vpc" "vpc" { cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true tags = { Name = "vpc" } } # Internet Gateway resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.vpc.id tags = { Name = "igw" } } これ何?
22 Terraform リソース名? • “main” だったり ”this” だったりする resource "aws_vpc"
"main" { cidr_block = "10.0.0.0/16" # VPCのCIDRブロック tags = { Name = "main-vpc" } } resource "aws_internet_gateway" “this" { vpc_id = aws_vpc.main.id tags = { Name = "igw" } }
23 Terraform リソース名? • CloudFormationで言うと ここの「論理 ID(リソース の名前)」みたいなもの • ※イメージです
Resources: TestVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Tags: - Key: Name Value: TEST-VPC
24 Terraform リソース名? • 「Terraform Best Practices」 の 「Naming conventions」に記載
がある • https://www.terraform-best-practices.com/naming • リソース名の主な目的 • 同じタイプの複数のリソースを 一意に区別できるようにする • 単一のリソースである場合、 もしくは適切な名称が無い場合 は this を使う resource "aws_vpc" “this" { # … } resource "aws_instance" "web" { # … } resource "aws_instance" “app" { # … } resource "aws_instance" “bastion" { # … } VPC は一つしかないので this EC2 は複数あるので用途などに 合わせて適切な名称を付ける
25 Terraform リソース名? • リソース名でリソースタイプを繰り返すべきではない resource "aws_route_table" "public" { #
… } resource "aws_route_table" "public_route_table" { # … }
26 Terraform リソース名? • つまり、これはあまり良く なかったってことです • this などにした方が良い ##################################################
# VPC ################################################## # VPC resource "aws_vpc" "vpc" { cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true tags = { Name = "vpc" } } # Internet Gateway resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.vpc.id tags = { Name = "igw" } }
27 目次 • はじめに • Terraform おさらい • Terraform リソース名?
• Terraform モジュールの話 • Terraform スタイルガイド • その他
28 Terraform モジュールの話
29 Terraform モジュールの話 main.tf よし、完璧だ
30 Terraform モジュールの話 main.tf リソース名の頭に システム略称を つけたいなぁ
31 Terraform モジュールの話 main.tf リソース名の頭に システム略称を つけたいなぁ VPC の tag
を編集 Public Subnet の tag を編集 Private Subnet の tag を編集 Security Group の tag を編集 EC2 1 台目の tag を編集 EC2 2 台目の tag を編集 EC2 3 台目の tag を編集 ALB の tag を編集
32 Terraform モジュールの話 main.tf リソース名の頭に システム略称を つけたいなぁ VPC の tag
を編集 Public Subnet の tag を編集 Private Subnet の tag を編集 Security Group の tag を編集 EC2 1 台目の tag を編集 EC2 2 台目の tag を編集 EC2 3 台目の tag を編集 ALB の tag を編集 いちいち全部修正するのは面倒くさい ミスが起きる可能性
33 Terraform モジュールの話 main.tf variables.tf 変数を管理する .tf ファイルに分ける
34 Terraform モジュールの話 main.tf variables.tf 変数を管理する .tf ファイルに分ける ############################## #
VPC ############################## resource "aws_vpc" “this" { cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true tags = { Name = "${var.prefix}-vpc" } } variable "prefix" { type = string description = "リソース名のプリフィックス“ default = “emiki" }
35 Terraform モジュールの話 main.tf 開発環境も作ろう main.tf
36 Terraform モジュールの話 main.tf XX 環境も作ろう main.tf main.tf main.tf main.tf
37 Terraform モジュールの話 main.tf あ、リソースの 構成を変えたい main.tf main.tf main.tf main.tf
38 Terraform モジュールの話 main.tf 修正 main.tf main.tf main.tf main.tf 修正
修正 修正 修正
39 Terraform モジュールの話 main.tf 修正 main.tf main.tf main.tf main.tf 修正
修正 修正 修正 いちいち全部修正するのは面倒くさい ミスが起きる可能性
40 Terraform モジュールの話 root main.tf envs dev prd modules vpc
ec2 variables.tf main.tf main.tf output.tf main.tf variables.tf output.tf
41 Terraform モジュールの話 root main.tf envs dev prd modules vpc
ec2 variables.tf main.tf main.tf output.tf main.tf variables.tf output.tf ルートモジュール 子モジュール
42 Terraform モジュールの話 root main.tf envs dev prd modules vpc
ec2 variables.tf main.tf main.tf output.tf main.tf variables.tf output.tf VPC というモジュールを 一つ作成すれば 複数の環境に展開できる
43 Terraform モジュールの話 root main.tf envs dev prd modules vpc
ec2 variables.tf main.tf main.tf output.tf main.tf variables.tf output.tf EC2 というモジュールを 一つ作成すれば 複数の環境に展開できる
44 Terraform モジュールの話 • output.tf やモジュールの呼び出しはこちらを参照ください!!! • [登壇レポート]「やさしいTerraform Module入門」というタイトルで登壇 しました
• https://dev.classmethod.jp/articles/terraform_speaker_report_jaws ug_tokyo/
45 目次 • はじめに • Terraform おさらい • Terraform リソース名?
• Terraform モジュールの話 • Terraform スタイルガイド • その他
46 Terraform スタイルガイド
47 Terraform スタイルガイド • 2024/3/30 Terraform 公式ドキュメントとしてスタイルガイドが 公開された • https://developer.hashicorp.com/terraform/language/style
• これまで存在していた Terraform のスタイルに関するドキュメント • Terraform を使用するためのベスト プラクティス | Google Cloud • https://cloud.google.com/docs/terraform/best-practices-for-terraform?hl=ja • Google Cloud が提供 • Terraform Best Practices • https://www.terraform-best-practices.com/ • ノルウェーのエンジニアの方が主導で提供しているコミュニティのドキュメント
48 Terraform スタイルガイド • コメントには # を使用 • 複数の単語を区切る際はアンダースコアを使用 •
例:◦container_envs、×container-envs • リソースタイプとリソース名は二重引用符で囲む • 例:resource “aws_wafv2_ip_set” “primary_general_allow” { #... } • すべての variable、 output に description を含める • variables や local の過度の使用は避ける • count や for_each は控えめに利用する • etc…
49 目次 • はじめに • Terraform おさらい • Terraform リソース名?
• Terraform モジュールの話 • Terraform スタイルガイド • その他
50 その他
51 その他 • モジュールの名前を間違えた • moved ブロックを使うとモジュールの名前を置き換えることができる • movedブロックを使ってリファクタリングしてみた •
https://dev.classmethod.jp/articles/terraform-moved-block-resource- refactoring/ • MFA 認証を使ってスイッチロールして Terraform を実行する • MFA認証を使ったAssumeRoleでTerraformをシンプルに実行する(aws configure export-credentials) • https://dev.classmethod.jp/articles/terraform-mfa-assumerole-export-credentials/ • map 型、list 型、object 型…
52 奥が深い
53 ありがとうございました
54 参考 • Terraform by HashiCorp • https://www.terraform.io/ • What
is Terraform | Terraform • https://developer.hashicorp.com/terraform/intro • Browse Providers | Terraform Registry • https://registry.terraform.io/browse/providers • Cloud9 上で Terraform の実行環境を作る~Amazon Linux 2023 版~ • https://dev.classmethod.jp/articles/cloud9-terraform-al2023/