35
実環境に Terraform導入したら 驚いた サイバーエージェント 桑野 章弘

実環境にTerraform導入したら驚いた

Embed Size (px)

Citation preview

Page 1: 実環境にTerraform導入したら驚いた

実環境に Terraform導入したら驚いたサイバーエージェント 桑野 章弘

Page 2: 実環境にTerraform導入したら驚いた

自己紹介

Page 3: 実環境にTerraform導入したら驚いた

自己紹介

• 桑野 章弘

• あだな:銀河

• 渋谷の道玄坂の上の方の緑の会社勤め

• 何やってる人?

Page 4: 実環境にTerraform導入したら驚いた

自己紹介

• 何やってるの?

• あんなサービスや、こんなサービスのサーバ構築したり、ミドルウェアやデータベース面倒みたり、監視入れたり

• いわゆるインフラエンジニア?

Page 5: 実環境にTerraform導入したら驚いた

自己紹介

• MongoDBアイドル…

Page 6: 実環境にTerraform導入したら驚いた

まだ来ません

Page 7: 実環境にTerraform導入したら驚いた

Terraform

Page 8: 実環境にTerraform導入したら驚いた

Terraformとは

• Hashicorp社製のプロダクト

Page 9: 実環境にTerraform導入したら驚いた

Terraformとは

• Hashicorp社製のプロダクト

• サーバ構成をバージョン管理

• サーバ構築のコード化

• 主要なIaaS系のプロバイダ対応

Page 10: 実環境にTerraform導入したら驚いた

使用例

Page 11: 実環境にTerraform導入したら驚いた

VPC 構築

# VPC for staging resource "aws_vpc" "staging" { cidr_block = “10.0.0.0/24” tags { Name = "staging" } }

Page 12: 実環境にTerraform導入したら驚いた

VPC 構築

• # Public subnets for staging !resource "aws_subnet" "staging_public" { vpc_id = "${aws_vpc.staging.id}" cidr_block = “10.0.0.0/25” availability_zone = "${var.aws.availability_zone}" map_public_ip_on_launch = "1" tags { Name = "staging_public" } }

Page 13: 実環境にTerraform導入したら驚いた

VPC Peering

# VPC Peering resource "aws_vpc_peering_connection" "staging_vpc_peering" { peer_owner_id = "${var.peer_owner_id}" peer_vpc_id = "${aws_vpc.staging.id}" vpc_id = “${aws_vpc.other_vpc.id}" }

ただしActivateは

マネジメントコンソールから

Page 14: 実環境にTerraform導入したら驚いた

EC2 instance作成

• resource "aws_instance" “staging-redis" { count = 1 ami = "${var.amis.centos}" instance_type = "t2.micro" key_name = "${var.aws.key_name}" subnet_id = "${aws_subnet.staging_private.id}" security_groups = [ "${aws_security_group.sg_staging_default.id}", "${aws_security_group.sg_staging_redis-slave.id}" ] tags { Name = "staging-redis-${count.index}" Service = “terraform-test“ } }

Page 15: 実環境にTerraform導入したら驚いた

Route53 レコード作成

• resource "aws_route53_record" "staging-redis-private" { zone_id = “${var.route53_zones.example.com}" name = “staging-redis${count.index}.in.dev.example.com" count = "1" type = "A" ttl = "300" records = [ "${element(aws_instance.staging-redis.*.private_ip, count.index)}" ] }

Page 16: 実環境にTerraform導入したら驚いた

実行方法

• plan で変更内容の確認$ terraform plan --refresh=false (省略) !+ aws_instance.stg-redis.1 ami: "" => "ami-88564a89" availability_zone: "" => "<computed>" ebs_block_device.#: "" => "<computed>" ephemeral_block_device.#: "" => "<computed>" instance_type: "" => "t2.micro" key_name: "" => "entm-dev" private_dns: "" => "<computed>" private_ip: "" => "<computed>" public_dns: "" => "<computed>" public_ip: "" => "<computed>" root_block_device.#: "" => "<computed>" security_groups.#: "" => "2" security_groups.3873480020: "" => "sg-22362c15" security_groups.3945627619: "" => "sg-22312345" subnet_id: "" => "subnet-1234c80e" tags.#: "" => "2" tags.Name: "" => "staging-redis-1" tags.Service: "" => "staging" tenancy: "" => "<computed>"

Page 17: 実環境にTerraform導入したら驚いた

実行方法

• applyで反映

$ terraform apply (省略)

Page 18: 実環境にTerraform導入したら驚いた

なしてつかったの?

Page 19: 実環境にTerraform導入したら驚いた

新規案件時

• 「AWSの構成管理どうする?」「CloudFormation?Ansible?Terraform?」

「新規だしTerraformいっちゃいますかねえ」

「いっちゃうかー」

Page 20: 実環境にTerraform導入したら驚いた

軽い気持ち (・A・)イクナイ!!

Page 21: 実環境にTerraform導入したら驚いた

軽い気持ち (・A・)イクナイ!!

一応まじめに決めました:(;゙゚’ω゚'):

Page 22: 実環境にTerraform導入したら驚いた

選定理由

• クラウド構成の履歴管理をバージョン管理システムベースでできる

• PullRequestベースでの作業分担、プロセス管理

Page 23: 実環境にTerraform導入したら驚いた

が、魅力的 でした

Page 24: 実環境にTerraform導入したら驚いた

良かった点

Page 25: 実環境にTerraform導入したら驚いた

PRベースの構築分担

• 各人がFeatureブランチ切ってそれをDevelop

ブランチでコードレビューしてからApplyっていうのができる

• 複数の人で開発してても誰が何やったか後で追える!( ・∀・)イイ!!

Page 26: 実環境にTerraform導入したら驚いた

チームでのPRベースの構築例

master

devel

feature

terraform apply

PR

PR

terraform plan&

コードレビュー

Page 27: 実環境にTerraform導入したら驚いた

厳しい点

Page 28: 実環境にTerraform導入したら驚いた

tfstate共有問題

• 変更内容はterraform.tfstateに入っていてplan時などはコードの変更内容をつけ合わせている

• 各個人の環境でtfstateの情報は同一になっていないといけない

• Terraform実行はローカル環境でやらない(jenkins等のCIツールや、スクリプト経由で行う)

• tfstateはconsulに保存できるのでそれで共有する

Page 29: 実環境にTerraform導入したら驚いた

planがあんまり信用出来ない

• terraform planで変更内容確認してterraform

applyで反映でした

• planでエラーでなくてもapplyで実行時にエラー出る時がある

• 辛い、というか恐怖がある

Page 30: 実環境にTerraform導入したら驚いた

バージョンアップ問題

• ものすごく開発が活発

• でもまだ実装されてない機能も多い

• バージョンアップに細かく追従していかないと辛い

• この2ヶ月くらいで、0.3.7->0.3.8->0.4.0->0.4.1と上げ続けている

• 三途の河感

Page 31: 実環境にTerraform導入したら驚いた

バージョンアップ問題

• 後、機能がまだ未実装のが結構あってこれがほしいいいいいいんだけどなああああああああああああっていうのが次のバージョンだったりする時も(でもホント開発速い)

• VPC Peering(0.3.8)

• countのsprintf対応(0.4.0)

• optimized iops ssd対応(0.4.0)

Page 32: 実環境にTerraform導入したら驚いた

バージョンアップ問題

• 後、機能がまだ未実装のが結構あってこれがほしいいいいいいんだけどなああああああああああああっていうのが次のバージョンだったりする時が多い

• VPC Peering(0.3.8)

• countのsprintf対応(0.4.0)

• optimized iops ssd対応(0.4.0)

https://github.com/hashicorp/terraform/

issues/28

Page 33: 実環境にTerraform導入したら驚いた

まとめ

Page 34: 実環境にTerraform導入したら驚いた

まとめ

• Terraform結構チームでの構築とか履歴管理に非常にいいと思うんですが、色々つらみも有る

• 追従しつつ頑張っていくつもりですがもしやめてたらごめんなさい:(;゙゚’ω゚'):

Page 35: 実環境にTerraform導入したら驚いた

つかってる方 情報交換 しましょう