Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TerraformとCloudFormationどちらを採用すべき?

 TerraformとCloudFormationどちらを採用すべき?

AKIBA.AWS ONLINE #03 -IaC を語りたい 編-
での登壇資料

57c0317c344c1cc5265a78ee0b57a94f?s=128

Fukazawa Shun

May 19, 2021
Tweet

Transcript

  1. None
  2. 5FSSBGPSNͱ$MPVE'PSNBUJPO ͲͪΒΛ࠾༻͢΂͖ʁ  ਂᖒ ढ़ʢ'VLB[BXB4IVOʣ "84ࣄۀຊ෦ίϯαϧςΟϯά෦

  3. 3 ⾃⼰紹介 ਂᖒ ढ़ʢFukazawa Shunʣ クラスメソッド株式会社 AWS事業本部コンサルティング部 @shun_quartet #AKIBAAWS

  4. 4 ϓϩϩʔά 5FSSBGPSN PS $MPVEGPSNBUJPO

  5. 5 جຊతͳબఆ৚݅ͱͯ͠ • ·ͣ͸બఆʹ͓͚Δલఏͱͯ͠ʜ • ೲ඼෺ͱͯ͠ࢦఆ͕͋Δ͔ • ϝϯόʔͰϝϯςՄೳ͔ • ෳࡶͳ΋ͷɺ࠷ઌ୺ͳ΋ͷ͕ྑ͍΋ͷͰ͸ͳ͍

    • ࠾༻ٕͨ͠ज़ͷಛੑΛνʔϜͰཧղ͠ӡ༻͍͚ͯ͠Δ͔
  6. 6 両者の違いって︖ 基本的な違い

  7. 7 $MPVEGPSNBUJPOʹ͍ͭͯ • "84͕ఏڙ • :BNM͔KTPOͰهड़ • "84্Ͱ࣮ߦ • *".ϩʔϧΛ࢖༻ͨ͠ηΩϡΞͳೝূ

    Ec2Instance: Type: AWS::EC2::Instance Properties: ImageId: Fn::FindInMap: - "RegionMap" - Ref: "AWS::Region" - "AMI"
  8. 8 5FSSBGPSNʹ͍ͭͯ • )BTIJ$PSQ͕ఏڙ • )$-Ͱهड़ • ϩʔΧϧ1$౳ͷϚγϯ্Ͱ࣮ߦ • Ωʔͷ؅ཧΛݕ౼͢Δඞཁ͕͋Δ

    • &$౳ͷ"84αʔϏε্Ͱͷ࣮ߦ΍εΠονϩʔϧ౳ ͰηΩϡΞͳೝূ͕Մೳ resource "aws_instance" "web" { ami = data.aws_ami.ubuntu.id instance_type = "t3.micro" tags = { Name = "HelloWorld" } }
  9. 9 ྆ऀͷҧ͍ͬͯʁ ྆ऀͷ۩ମతͳ ಛ௃Λݟ͍͖ͯ·͠ΐ͏ʂ

  10. 10 両者の違いって︖ 異なるリージョンへのデプロイ

  11. 11 ҟͳΔϦʔδϣϯ΁ͷσϓϩΠ • 4UBDL4FUT IUUQTEPDTBXTBNB[PODPNKB@KQ"84$MPVE'PSNBUJPOMBUFTU6TFS(VJEFTUBDLTFUTDPODFQUTIUNM • ҟͳΔϦʔδϣϯʹϦιʔεΛ࡞੒ߋ৽࡟আ͢Δػೳ • ҟͳΔΞΧ΢ϯτʹ΋σϓϩΠՄೳ Region

    Region Region Stack sets stack stack stack アカウントA アカウントB
  12. 12 ҟͳΔϦʔδϣϯ΁ͷσϓϩΠ • ҟͳΔ1SPWJEFSΛ༻͍Δ IUUQTXXXUFSSBGPSNJPEPDTQSPWJEFSTJOEFYIUNM Region Region Region Provider A

    Provider B Provider C provider aws { region = "ap-northeast-1” } provider aws { region = "us-east-1" alias = "use1" } resource "aws_instance" "web" { 〜〜〜 } resource "aws_instance" "web_use1" { provider = aws.use1 〜〜〜 }
  13. 13 ҟͳΔϦʔδϣϯ΁ͷσϓϩΠ • "84಺Ͱͷ*B$Ͱ͋Ε͹$MPVEGPSNBUJPOͷํ͕ҟͳΔϦʔ δϣϯ ΍ΞΧ΢ϯτʹσϓϩΠ͠΍͍͢ • ϚϧνϦʔδϣϯγεςϜͰͳͯ͘΋ηΩϡϦςΟͷ౎߹Ͱ"84$POGJH΍"NB[PO (VBSE%VUZ౳ΛશͯͷϦʔδϣϯʹల։͍ͨ͠ͱ͍ͬͨधཁʹ΋ରԠ͠΍͍͢ •

    5FSSBGPSN͸1SPWJEFSΛ੾Γସ͑Δ͜ͱ͕Ͱ͖ΔނͷϝϦοτ΋ɻ
  14. 14 異なるIaaSへのデプロイ 異なるIaaSへのデプロイ

  15. 15 ҟͳΔ*BB4΁ͷσϓϩΠ • $MPVEGPSNBUJPO͸"84ͷαʔϏεͷͨΊଞͷϓ ϥοτϑΥʔϜ΁ͷσϓϩΠ͸ରԠ͍ͯ͠ͳ͍ • 5FSSBGPSN͸1SPWJEFSΛ੾Γସ͑Δ͜ͱͰҟͳΔ *BB4ʹσϓϩΠ͕ߦ͑Δ • "84

    • ($1 • "[VSF ʜ
  16. 16 差分検出 差分検出

  17. 17 ࠩ෼ݕग़ • *B$Ͱ؅ཧ͸͍ͯ͠Δ΋ͷͷɺ͍ͭख࡞ۀͰ؀ڥΛमਖ਼ ͯ͠͠·͏͜ͱ͸Α͋͘Δ • ؀ڥͱίʔυ͕ဃ཭ͯ͠͠·ͬͨࡍͷݕग़͸ͲͷΑ͏ʹߦ͏͔ʁ

  18. 18 ࠩ෼ݕग़ • $MPVEGPSNBUJPOͷ৔߹ɺυϦϑτݕग़ͱ͍͏ػೳ͕͋Δ IUUQTEPDTBXTBNB[PODPNKB@KQ"84$MPVE'PSNBUJPOMBUFTU6TFS(VJEFEFUFDUESJGUTUBDLIUNM • ؀ڥͱίʔυͷဃ཭ΛࣗಈͰݕग़͢Δػೳ • $POGJHϧʔϧͱ૊Έ߹ΘͤͨΓͯ͠௨஌΋Մೳ Stack

    VPC NAT gateway Instance Instance ≒ AWS Config EventBridge
  19. 19 ࠩ෼ݕग़ • 5FSSBGPSNͷ৔߹ɺ1MBOίϚϯυΛ࣮ߦͯ͠4UBUFͱͷࠩ෼ Λൺֱ͢Δ IUUQTXXXUFSSBGPSNJPEPDTDMJDPNNBOETQMBOIUNM • ΦϓγϣϯΛ෇͚Δ͜ͱͰίʔϧόοΫ͔Βࠩ෼ͷݕग़͕Մೳ VPC NAT

    gateway Instance Instance ≒ $ terraform plan -detailed-exitcode
  20. 20 ࠩ෼ݕग़ • 5FSSBGPSNͷ৔߹ɺࣗಈԽ͍ͨ͠৔߹͸࡞ΓࠐΈ͕ඞཁʹͳΔ • $MPVEGPSNBUJPOͩͱࠩ෼ݕग़͸"84ͷϚωʔδυαʔϏε ʹدͤΔ͜ͱ͕Ͱ͖Δ

  21. 21 両者の違いって︖ ロジック

  22. 22 ϩδοΫ • ಉ͡ϦιʔεΛෳ਺࡞੒͍ͨ͠৔߹΍ɺ໭Γ஋΍ม਺ʹΑͬͯΞ ΫγϣϯΛม͍͑ͨέʔε͸͋Δ • ྫɿ ม਺ʹ֨ೲ͞Ε͍ͯΔ";෼͚ͩ4VCOFUΛ࡞੒͍ͨ͠ • ϩδοΫͷ࣮૷͸ͲͷΑ͏ʹߦ͏͔

  23. 23 ϩδοΫ • $MPVEGPSNBUJPOͷ৔߹ • $POEJUJPOTηΫγϣϯΛ࢖༻͢Δ • ࢖༻Մೳͳؔ਺ • 'O"OE

    • 'O&RVBMT • 'O*G • 'O/PU • 'O0S Description: "Template.” Parameters: EnvType: Type: String AllowedValues: - prod - test Conditions: CreateProdResources: !Equals - !Ref EnvType - prod Resources: 〜〜〜 Outputs: 〜〜〜
  24. 24 ϩδοΫ • 5FSSBGPSNͷ৔߹ • ߏ଄ମΛ༻͍ͨ܁Γฦ͠ॲཧ • ࡾ߲ԋࢉࢠ • ૊ΈࠐΈؔ਺

    • ͍ΘΏΔϓϩάϥϜݴޠʹ ͍ۙهड़ • ෼ذॲཧ͸ͳ͍ dynamic "origin_group" { for_each = var.load_balancer_origin_groups content { name = origin_group.key dynamic "origin" { for_each = origin_group.value.origins content { hostname = origin.value.hostname } } } } variable "load_balancer_origin_groups" { type = map(object({ origins = set(object({ hostname = string })) })) }
  25. 25 排他制御 排他制御

  26. 26 ഉଞ੍ޚ • ಉ࣮࣌ߦ͞Εͨ࣌ʹ4UBDLPS4UBUF্͕ॻ͖͞Εͯ͠·͏͜ͱ ͸ͳ͍ͷ͔ʁ • ෳ਺ਓͰӡ༻͍ͯ͠Δࡍʹ͸ॏཁͳϙΠϯτɻɻ

  27. 27 ഉଞ੍ޚ • $MPVEGPSNBUJPOͷ৔߹ • ࣮ߦத͸$3&"5&@*/@130(3&44εςʔλεʹͳΔ • $3&"5&@*/@130(3&44ͷ࠷த͸มߋෆՄ

  28. 28 ഉଞ੍ޚ • 5FSSBGPSNͷ৔߹ • 4UBUFΛͲ͜ʹஔ͘ͷ͔ʹΑͬͯҟͳΔ • IUUQTXXXUFSSBGPSNJPEPDTMBOHVBHFTFUUJOHTCBDLFOETJOEF YIUNM •

    %ZOBNP%#MPDLΛ༻͍Δ͜ͱ͕Ͱ͖Ε͹ഉଞ੍ޚՄೳ • IUUQTXXXUFSSBGPSNJPEPDTMBOHVBHFTUBUFMPDLJOHIUNM
  29. 29 両者の違いって︖ バージョン管理

  30. 30 όʔδϣϯ؅ཧ • όʔδϣϯΛ͏·͘؅ཧ͢Δඞཁ͕͋Δ • ϝϯόʔͷ࣮ߦ؀ڥࠩҧ • ࠷৽΁ͷ௥ैͱݱߦҡ࣋

  31. 31 όʔδϣϯ؅ཧ • $MPVEGPSNBUJPOͷ৔߹ • "84ͷαʔϏεͳͷͰ͍ΘΏΔόʔδϣϯͷ֓೦͕ͳ͍ • ςϯϓϨʔτόʔδϣϯ͸ଘࡏ͢Δ΋ͷͷɺݱ࣌఺Ͱ͔͠ ͳ͍ͷͰόʔδϣϯ؅ཧͷඞཁ͕ͳ͍ •

    IUUQTEPDTBXTBNB[PODPNKB@KQ"84$MPVE'PSNBUJPOMBUFTU6 TFS(VJEFGPSNBUWFSTJPOTUSVDUVSFIUNM
  32. 32 όʔδϣϯ؅ཧ • 5FSSBGPSNͷ৔߹ • 5FSSBGPSNͦͷ΋ͷͱ1SPWJEFSͷόʔδϣϯΛ؅ཧ͢Δ • 5FSSBGPSNͷόʔδϣϯ͸UGFOWͰ؅ཧ • IUUQTHJUIVCDPNUGVUJMTUGFOW

    • 1SPWJEFS͸SFRVJSFE@QSPWJEFSTͰࢦఆ • ࠷ۙ͸UFSSBGPSNMPDLIDMͱ͍͏QSPWJEFSͷMPDLϑΝΠϧ΋ొ৔ • IUUQTXXXUFSSBGPSNJPEPDTMBOHVBHFQSPWJEFSTSFRVJSFNFOUTIUNM • ͍ΘΏΔϓϩάϥϛϯάݴޠͷόʔδϣϯ؅ཧʹ͍ۙ
  33. 33 開発ツール 開発ツール

  34. 34 ։ൃπʔϧ • γϯλοΫεΤϥʔ౳͸։ൃஈ֊Ͱݕ஌͍ͨ͠ • σϓϩΠ͔ͯ͠ΒΤϥʔͩͱ໘౗ • *%&ʹ૊ΈࠐΊΔ։ൃิॿπʔϧ͸͋Δͷ͔ʁʁ

  35. 35 ։ൃπʔϧ • $MPVEGPSNBUJPO • $GOMJOU • IUUQTBXTBNB[PODPNKQCMPHTOFXTHJUQSFDPNNJUWBMJEBUJPOPGBXT DMPVEGPSNBUJPOUFNQMBUFTXJUIDGOMJOU •

    ҎԼͷΑ͏ͳνΣοΫΛࣗಈͰͯ͘͠ΕΔ • ਖ਼͍͠ܗࣜʢ:BNM PS+TPOʣͰॻ͚͍ͯΔ͔ • όά͸ͳ͍͔ʢଘࡏ͠ͳ͍ม਺ࢀরɺฦΓ஋ͷظ଴ʣ • ଞͷ࣮૷ํ๏ͷఏҊʢϋʔυίʔυͷճආʣ • *%&ʢ74$PEFʣͷϓϥάΠϯ΋͋Δ • IUUQTHJUIVCDPNBXTTDSJQUJOHHVZDGPSN74$PEF
  36. 36 ։ൃπʔϧ • 5FSSBGPSN • ίϚϯυΦϓγϣϯʹࣗಈิਖ਼ػೳ͕͋Δ • IUUQTXXXUFSSBGPSNJPEPDTDMJDPNNBOETGNUIUNM • อଘ࣌ʹ͜ͷίϚϯυΛ࣮ߦ͢Ε͹ࣗಈͰߏจमਖ਼

    • -JOUFSπʔϧ΋ଘࡏ • IUUQTHJUIVCDPNUFSSBGPSNMJOUFSTUGMJOU • ίʔυ͕ηΩϡϦςΟతʹ໰୊ͳ͍͔ΛνΣοΫ͢Δπʔϧ΋ • ྫɿηΩϡϦςΟάϧʔϓ͕શ։Ͱઃఆ͞Ε͍ͯΔ • IUUQTHJUIVCDPNUGTFDUGTFD • *%&ͷϓϥάΠϯ΋͋Δ • 74$PEF 1Z$IBSN $ terraform fmt
  37. 37 まとめ まとめ

  38. 38 ·ͱΊ • $MPVEGPSNBUJPO • ෳࡶͳॲཧͷهड़͸೉͍͠ • ͋·Γෳࡶʹͯ͠͠·͏ͱݟʹ͘͘ͳΔ͜ͱ΋ • "84ͱͷ਌࿨ੑ͕ߴ͘ɺؔ࿈αʔϏε΋ଟ͍

    • ҟͳΔϦʔδϣϯ΁ͷσϓϩΠɺ؀ڥͱͷဃ཭ݕग़౳ • 5FSSBGPSN • ಉ͡ߏจͰҧ͏*BB4ʹσϓϩΠͰ͖Δ • 1SPWJEFS͕੾Γସ͑ΒΕΔނͷϝϦοτ • ߏจ΍όʔδϣϯ؅ཧ͕ϓϩάϥϛϯάݴޠʹ͍ۙ • ϓϩάϥϜܦݧͷ͋Δํ͸ೃછΈ΍͍͔͢΋
  39. 39 ऴΘΓ օ͞Μͷૉఢͳ *B$ϥΠϑΛԠԉͯ͠·͢ʂ

  40. None