HashiCorp Tools Meetup #hashi_wantedly での発表資料です。
TERRAFORM at WANTEDLY2015-08-05HashiCorp Tools Meetup@dtan4
View Slide
Daisuke Fujita@dtan4Πϯλʔϯ @ΠϯϑϥνʔϜ
HashiCorp in WantedlyTerraform Vagrant Packer
ࠓ͢͜ͱWantedly Ͱͷ Terraform ӡ༻ࣄྫ
Terraform flow@ Wantedlysince May 2015
Terraform Ͱཧ͍ͯ͠Δ27 resource typesaws_customer_gatewayaws_db_instanceaws_db_security_groupaws_db_subnet_groupaws_elasticache_clusteraws_elasticache_subnet_groupaws_elbaws_iam_groupaws_iam_group_membershipaws_iam_group_policyaws_iam_roleaws_iam_role_policyaws_iam_useraws_iam_user_policyaws_instanceaws_internet_gatewayaws_network_aclaws_route_tableaws_route_table_associationaws_s3_bucketaws_security_groupaws_subnetaws_vpcaws_vpn_connectionaws_vpn_connection_routeaws_vpn_gatewaydnsimple_record
Terraform Ͱཧ͍ͯ͠ΔAWS199DNSimple155354 resources
Terraform ڥGitHub wercker S3 remote backendVagrant CoreOS Dockerquay.io/wantedly/terraform3FNPUF-PDBM
Terraform flowTerraform ίʔυΛॻ͍ͯ Pull Request Λग़͢
Terraform flowCI Ͱςετ (terraform plan) ͕Δ
Terraform flowΠϯϑϥνʔϜ͕ϨϏϡʔͯ͠ Merge
Terraform flowCI Ͱ࣮ڥͷద༻ (terraform apply) ͕ߦΘΕΔ
e.g. DNS ϨίʔυՃ
e.g. IAM ϢʔβՃ
e.g. GitHub ্Ͱ֬ೝͰ͖ͯศར
Terraform ಋೖͷաఔ
ಋೖͨ͠ܦҢ• Management Console ϙνϙνۀ͔Βͷ٫• ΠϯϑϥνʔϜͷ࡞ۀूத͔Βͷ٫• ߏங࡞ۀͷཤྺΛ͍ͨ͠• ϦιʔεҰཡΛ ͩΕͰ؆୯ʹݟΒΕΔΑ͏ʹ͍ͨ͠• ϦιʔεෳΛָʹ͍ͨ͠
Ұ͔ΒΠϯϑϥߏஙϦϓϨʔεͰͳ͘ɺ ͍·ಈ͍͍ͯΔΠϯϑϥϦιʔε ΛίʔυԽ͍ͨ͠
ݱߦڥͷ Terraform ಋೖhttps://github.com/hashicorp/terraform/issues/581
ݱߦڥͷ Terraform ಋೖhttps://github.com/hashicorp/terraform/issues/581طଘϦιʔεͷ Terraform ίʔυԽ ࣮͞Ε͍ͯͳ͍
ݱߦڥͷ Terraform ಋೖex: hoge ͱ͍͏ S3 bucket ͕͋ͬͨͱ͖resource "aws_s3_bucket" "hoge" {bucket = "hoge"acl = "private"}{"version": 1,"serial": 1,"modules": {"path": ["root"],"outputs": {},"resources": {"aws_s3_bucket.hoge": {"type": "aws_s3_bucket","primary": {"id": "hoge","attributes": {"acl": "private","bucket": "hoge","id": "hoge"}}}}}}TUGUFSSBGPSNUGTUBUF
ݱߦڥͷ Terraform ಋೖex: hoge ͱ͍͏ S3 bucket ͕͋ͬͨͱ͖resource "aws_s3_bucket" "hoge" {bucket = "hoge"acl = "private"}{"version": 1,"serial": 1,"modules": {"path": ["root"],"outputs": {},"resources": {"aws_s3_bucket.hoge": {"type": "aws_s3_bucket","primary": {"id": "hoge","attributes": {"acl": "private","bucket": "hoge","id": "hoge"}}}}}}TUGUFSSBGPSNUGTUBUFtfstate (JSON) ਓྗͰॻ͘ͷݫ͍͠
Export existing AWS resources to Terraform style (tf, tfstate)dtan4/terraforming
Terraforming• طଘͷ AWS / DNSimple Ϧιʔε͔Β Terraform ͷίʔυ (tf, tfstate) Λੜ͢Δ ίϚϯυϥΠϯπʔϧ• 24छྨͷ AWS ϦιʔεʹରԠ• Wantedly ͷ Terraform ίʔυͷେΛੜ• Issue & Pull Request ͓·ͪͯ͠·͢ʂdtan4/terraforming$ gem install terraforming # or$ docker pull quay.io/dtan4/terraforming
Terraforming• S3 buckets ͷ tf Λੜ• S3 buckets ͷ tfstate Λੜ• S3 buckets ͷ tfstate Λੜ͠ɺ طଘͷ terraform.tfstate ͱϚʔδ$ terraforming s3$ terraforming s3 --tfstate \--merge=/path/to/terraform.tfstate$ terraforming s3 --tfstatedtan4/terraforming
http://qiita.com/dtan4/items/345c56281ab0e87d6646
ૺ۰ͨ͠
terraform plan ͕৴༻ग़དྷͳ͍• HCL ͷγϯλοΫενΣοΫͱ Terraform ύϥϝʔλͷνΣοΫͷΈɺ API ͷ dry-run ͠ͳ͍• terraform plan ͕௨ͬͯɺύϥϝʔλ͕AWS తʹෆਖ਼Ͱ terraform apply ʹࣦഊ͢Δ• CI Ͱʮςετʯ͍ͯ͠Δҙຯ͕…
terraform plan ͕৴༻ग़དྷͳ͍• AWS ͷυΩϡϝϯτಡ·ͳ͍ͱ͍͚ͳ͍• terraform apply ࣦഊͯ͠ϦΧόϦͰ͖Δ ΈΛ࡞Δ• खݩͰ apply Ͱ͖Δڥ
ELB ԼͷΠϯελϯε͕ ҙਤͤͣஔ͖ΘΔ• Terraform ͷ ELB resource Δ͢ΠϯελϯεΛ໌ࣔతʹॻ͘ඞཁ͋Γ• Wantedly ͰࣗલπʔϧͰ Πϯελϯεͷ૿ݮɺELB ͷΔ͠Λߦ͏• Terraform ίʔυͱ࣮ࡍͷڥʹࠩҟ͕ग़Δ
ELB ԼͷΠϯελϯε͕ ҙਤͤͣஔ͖ΘΔ• සൟʹΠϯελϯε͕ஔ͖ΘΔ ELB Terraform Ͱཧ͠ͳ͍͜ͱʹͨ͠• ֎෦Ͱಈతͳมߋ͕͋Γ͏ΔϦιʔε ͋͑ͯཧ͠ͳ͍
IAM ϢʔβআͰࣦഊ• IAM ϢʔβࣗମΛফ͢લʹΫϨσϯγϟϧ ϩάΠϯϓϩϑΝΠϧΛফ͢ඞཁ͕͋Δ• Terraform ͦΜͳͷ͓ߏ͍ͳ͠ʹ delete-user͠Α͏ͱ͢Δ• खಈͰґଘϦιʔεΛফ্ͨ͠Ͱ applyhttp://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/Using_DeletingUserFromAccount.html
·ͱΊ
·ͱΊ• Wantedly ͷΠϯϑϥ Terraform Ͱཧ͞Ε͍ͯ·͢ʂ• ݱߦΠϯϑϥΛ Terraform Ͱཧ͢ΔͨΊʹ Terraforming ͱ͍͏πʔϧΛ։ൃ͠·ͨ͠• ͯ͢Λ Terraform ʹ͖ͤͬΓʹ͠ͳ͍