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

Terraform+cloud-initで自宅サーバのLXDをIaCするお話

 Terraform+cloud-initで自宅サーバのLXDをIaCするお話

自動化をゆるく学ぶ会

Avatar for Ryotaro Onoue

Ryotaro Onoue

June 20, 2025
Tweet

More Decks by Ryotaro Onoue

Other Decks in Technology

Transcript

  1. 0. whoami  - ඌ্ ྒྷଠ࿕ (͓ͷ͏͑ Γΐ͏ͨΖ͏) - Twitter:

    @YumNumm (΋͙΋͙) - 2004.09.17ੜ·Ε - ਆಸ઒ݝࡏॅ ܦྺ - ԣ඿αΠΤϯεϑϩϯςΟΞߴߍ(୯Ґ੍ཧ਺Պ)ग़਎ - גࣜձࣾ ΏΊΈ 2023೥4݄ ৽ଔೖࣾ - Flutter Ϧʔυ(ϚΠελʔΤϯδχΞ) ޷͖ Dart(Flutter), TypeScript, Cloudflare, ๷ࡂ ৘ใ, ৽͍͠΋ͷ
  2. 0. whoami  - EQMonitor ͱ͍͏஍਒ؔ࿈ͷΞϓϦέʔ γϣϯΛݸਓ։ൃ͍ͯ͠·͢ - Flutter੡ -

    Φʔϓϯιʔε - DB͸Supabase CloudΛ࢖༻த - API(BFF)ͱͯ͠Cloudflare WorkersΛڬΜͰ͍·͢ - ௨஌഑৴ج൫, σʔλॲཧج൫ͱͯ͠ OCIΛར༻த - (࠷ۙߋ৽ΛαϘ͍ͬͯΔ) - https://github.com/YumNumm/ EQMonitor
  3. Ubiquiti  1. ࣗ୐αʔό, Πϯϑϥͷ͝঺հ - ϝΠϯͷωοτϫʔΫपΓ - Ubiquiti Aggregation

    (্): 10G SFP×8 εΠον - Ubiquiti U7 Pro(ӈ): ΞΫηεϙΠϯτ - Ubiquiti Dream Machine Special Edition(Լ): ϝΠϯϧʔλʔ - 10G SFPx2, GbE RJ45x8, 2.5GbE RJ45
  4. Ubiquiti  1. ࣗ୐αʔό, Πϯϑϥͷ͝঺հ - ϝΠϯͷωοτϫʔΫपΓ - Ubiquiti Dream

    Machine Special Edition: ϝΠϯϧʔλ - ؂ࢹΧϝϥͷ࿥ը - ͓͏ͪDNSΩϟογϡαʔόͱͯ͠΋Քಇ
  5. WIC  1. ࣗ୐αʔό, Πϯϑϥͷ͝঺հ - ೲށ - FUJITSU RX2530

    M4 (Լ͔Β1ஈ໨ ࠨ) - Ubuntu 24.04 LTS - CPU:Intel Xeon Gold 6138 x2 (40C 80T) - ϝϞϦ: 128GB - UPS (1ஈ໨ ӈ) - 1,000ԁ ϠϑΦΫߪೖ - L2 Switch (2ஈ໨ࠨ, 10G SFP -> 10G RJ45x8) - M1 Mac mini (3ஈ໨ࠨ) - Asahi LinuxͰUbuntuΛಈ͔͍ͯ͠·͢ - ThinkPad X1 Carbon (4ஈ໨ӈ) - ؂ࢹσΟεϓϨΠ༻
  6. - ؂ࢹ - EQMonitorͰӡ༻͍ͯ͠Δαʔό(Oracle Cloud, Cloudflare)ͷϩά, ϝτϦΫεऩू - ࣗ୐ͷՄࢹԽ -

    DockerίϯςφϨδετϦ - Harborͱ͍͏OSSΛಈ͔͍ͯ͠Δ - ϝσΟΞετϨʔδ, ϑΝΠϧετϨʔδ - ࡱͬͨࣸਅ΍ಈըΛอ؅/macOSͷTimeMachine DLNA, SMBͰΞΫηε - ࣗ෼༻ͷGitHub Actions Self Hosted Runner - ࣗ෼༻ͷWiki, λΠϜτϥοΩϯά ͳͲͳͲ…  1-1. ࣗ୐αʔόͰԿ͍ͯ͠Δͷ?
  7. Ubiquiti 1. ࣗ୐αʔό, Πϯϑϥͷ͝঺հ  - EQMonitorͷAPIͷϩά - ֎ʹ࿐ग़͍ͯ͠ΔOpenTelemetryΤϯυϙΠϯτΛ௨ͯ͡ɺLoki(Cloudflare R2

    backend)ʹϩά͕֨ೲ - Grafana͸Loki͔ΒϩάΛऔಘ - EQMonitorͷAPIͷϩά - ֎ʹ࿐ग़͍ͯ͠ΔOpenTelemetryΛ௨ͯ͡ɺLoki(Cloudflare R2 backend)ʹϩά͕֨ೲ - Grafana͸Loki͔ΒϩάΛऔಘ - ෆ۩߹ͷௐࠪ΍Τϥʔ཰؂ࢹͳͲʹར༻
  8. Ubiquiti  \ - ͓͏ͪͷ֤छ৘ใ - ϥοΫαʔό಺ͷϝτϦΫε, ࣨԹ, ిྗ࢓༷ঢ়گͳͲΛϞχλϦϯά -

    ͓͏ͪͷ֤छ৘ใ - ϥοΫαʔό಺ͷϝτϦΫε, ࣨԹ, ిྗ࢓༷ঢ় گͳͲΛϞχλϦϯά - ࣌ʑ೷͖ʹߦ͘ͱ݁ߏ͓΋͠Ζ͍
  9. ͢΂ͯͷαʔϏε͸ίϯςφͷ্ʹ৐͔͍ͬͬͯ·͢  2-1. LXD - ʮίϯςφʯ - ͦΕͧΕͷϓϩηεΛִ཭ۭͨؒ͠Ͱ࣮ߦ͢Δٕज़ - Linux

    Kernelͷnamespace, cgroupͳͲͰ࣮ݱ - Ծ૝ϚγϯΑΓ΋Φʔόʔϔου͕গͳ͍ - ʮγεςϜίϯςφʯ - ΧʔωϧҎ֎ͷLinuxγεςϜ͕ಈ͍͍ͯΔίϯςφͷ͜ͱ -> initϓϩηε΋ؚΊͯ·Δ·Δ্ཱ͕ͪΔ - systemd΍ - Dockerͱಉ͡? - Docker͸Ծ૝Ϛγϯͱҧ͍ɺ୯ҰͷϓϩηεΛಈ͔͢ͷ͕جຊ - த਎΋ߋ৽͠ͳ͍Ͱ࢖͍ࣺͯΔͷ͕جຊ - -> DockerͰ͸ɺΰχϣΰχϣࢼߦࡨޡ͢Δͷʹ޲͍͍ͯͳ͍ - Ծ૝ϚγϯͷΑ͏ʹϑϧͷOS͕ಈ͘ ͨͩ͠ɺԾ૝Ϛγϯ΄ͲͷΦʔόʔϔου͕ͳ͍ Docs: https://lxd-ja.readthedocs.io/
  10. Lightweight open source virtualization framework  2-1. LXD - LXDͱ͸?

    - Lex-deeͱൃԻ͢ΔΒ͍͠ - ʮ࣍ੈ୅ͷγεςϜίϯςφͱԾ૝ϚγϯϚωʔδϟʯ - Ubuntu(LinuxσΟετϦϏϡʔγϣϯ)ͷ։ൃࢧԉΛ͍ͯ͠ΔCanonicalࣾʹΑͬͯ࡞ΒΕ͍ͯΔ - γεςϜίϯςφ͚ͩͰ͸ͳ͘ɺԾ૝Ϛγϯ΋؅ཧͰ͖Δ - ಺෦తʹ͸ɺQEMUΛ࣮ߦ͍ͯ͠Δ - windows΋ಈ͔ͤΔ - LXDΛෳ਺ཱͯͯɺՄ༻ੑ޲্, ෛՙ෼ࢄ΋Մೳ - CephΛ࢖ͬͯετϨʔδΛ෼ࢄͤ͞Δ͜ͱ΋Մೳ - LXDΠϯελϯεͷதͰDockerΛ্ཱͪ͛Δ͜ͱ΋Մೳ - Ubuntuʹ͸ϓϦΠϯετʔϧࡁΈ - lxd-uiͱ͍͏WebUI΋༻ҙ͞Ε͍ͯΔ - ͪͳΈʹɺproxmoxͷ಺෦Ͱ͸LXD͔kvm͕࢖ΘΕΔ Docs: https://lxd-ja.readthedocs.io/
  11. Lightweight open source virtualization framework  2-1. LXD - LXDͱ͸?

    - Lex-deeͱൃԻ͢ΔΒ͍͠ - ʮ࣍ੈ୅ͷγεςϜίϯςφͱԾ૝ϚγϯϚωʔδϟʯ - Ubuntu(LinuxσΟετϦϏϡʔγϣϯ)ͷ։ൃࢧԉΛ͍ͯ͠ΔCanonicalࣾʹΑͬͯ࡞ΒΕ͍ͯΔ - γεςϜίϯςφ͚ͩͰ͸ͳ͘ɺԾ૝Ϛγϯ΋؅ཧͰ͖Δ - ಺෦తʹ͸ɺQEMUΛ࣮ߦ͍ͯ͠Δ - windows΋ಈ͔ͤΔ - LXDΛෳ਺ཱͯͯɺՄ༻ੑ޲্, ෛՙ෼ࢄ΋Մೳ - CephΛ࢖ͬͯετϨʔδΛ෼ࢄͤ͞Δ͜ͱ΋Մೳ - LXDΠϯελϯεͷதͰDockerΛ্ཱͪ͛Δ͜ͱ΋Մೳ - Ubuntuʹ͸ϓϦΠϯετʔϧࡁΈ - lxd-uiͱ͍͏WebUI΋༻ҙ͞Ε͍ͯΔ - ͪͳΈʹɺproxmoxͷ಺෦Ͱ͸LXD͔kvm͕࢖ΘΕΔ Docs: https://lxd-ja.readthedocs.io/ ίϯςφ্ཱͪ͛ ࣮ԋ
  12. Lightweight open source virtualisation framework  2-2. LXD - LXDͱ͸?

    - ʮ࣍ੈ୅ͷγεςϜίϯςφͱԾ૝ϚγϯϚωʔδϟʯ - Canonicalࣾ - Ubuntu(LinuxσΟετϦϏϡʔγϣϯ)ͷ։ൃࢧԉΛ͍ͯ͠ΔCanonicalࣾʹΑͬͯ࡞ΒΕ͍ͯΔ - γεςϜίϯςφ͚ͩͰ͸ͳ͘ɺԾ૝Ϛγϯ΋؅ཧͰ͖Δ - ಺෦తʹ͸ɺQEMUΛ࣮ߦ͍ͯ͠Δ - Ubuntuʹ͸ϓϦΠϯετʔϧࡁΈ Docs: https://lxd-ja.readthedocs.io/
  13. Lightweight open source virtualization framework  2-1. LXD - ؆୯ʹΠϯελϯεΛ࡞ΕΔ͜ͱ͸෼͔ͬͨ👍

    - Ͳ͜ͰԿ͕ͲΜͳߏ੒Ͱಈ͍͍ͯΔ͔෼͔Βͳ͘ͳ͖ͬͯͨ - ͍͔ͭΧΦεͳ͓Ոʹͳͬͯ͠·͏͜ͱ͸༰қʹ૝૾Ͱ͖Δ - ॳظઃఆ͕໘౗… - Ϣʔβ࡞੒, SSH伴ొ࿥, apt upgrade... શ෦खಈ!? ໘౗!!! - IaC͍ͨ͠... Docs: https://lxd-ja.readthedocs.io/
  14.  - ΍͚ʹϑΝϯ͕͏Δ༷ͯ͘͞ࢠΛݟͨΒɺSSD͕ಡΈऔΕͳ͘ͳ͍ͬͯͨ - εϩοτͷ͓૟আͯ͠࠶ىಈͨ͠Β࣏ͬͪΌͬͨ - ݪҼ͕Կͩͬͨͷ͔Α͘෼͔͍ͬͯͳ͍͕ɺ͋Ε͔Β਺िؒ࠶ൃ͍ͯ͠ͳ͍ - Ξϥʔτ΋૊Έ్தͰඈΜͰ͜ͳ͔ͬͨ -

    ޾͍σʔλ͕ඈͿ͜ͱ΋ͳ͔ͬͨ - αʔό಺ͷσʔλ͕͍ͭඈͿ͔෼͔Βͳ͍ - RAIDߏ੒૊ΜͰ͍ͨͱͯ͠΋ɺಉ࣌ʹࢮ͵Մೳੑ͸શવ͋Δ - ͳʹ͔ͷϛεͰ rm -rf /* ͱ͔ͪ͠Ό͏͔΋͠Εͳ͍ -> IaC͢Δͱ͍͏ڧ͍ҙࢥ ͦΜͳ͋Δ೔ͷ͜ͱ...
  15. Infrastructure as Code  2-2. IaCͱ͸? IaC: ΠϯϑϥϦιʔεΛίʔυͰ؅ཧ͢Δ Ex. Ansible,

    Terraform, AWS CloudFormation - IaCͷ͏Ε͍͠ͱ͜Ζ - ؀ڥΛෳ੡͠΍͍͢ - ผregionʹಉ͡؀ڥΛ࡞Γ͍ͨ .etc - ώϡʔϚϯΤϥʔͷ௿ݮ - ίʔυϨϏϡʔΛ௨ͯ͡ɺมߋͷਖ਼͠͞ΛϨϏϡʔͰ͖Δ - ίʔυ͔ΒίετΛਪఆ͠ɺΠϯϑϥΛ࠷దԽ - cf. infracost: https://www.infracost.io/ -> ࠓճ͸ɺTerraformͱcloud-initͰࣗ୐ͷLXDΠϯελϯεΛ؅ཧ͠·͢
  16. by HashiCorp  2-3. Terraform - HashiCorpࣾ੡ͷIaCπʔϧ - ΠϯϑϥϦιʔεΛߏங,؅ཧͰ͖Δ -

    Ex. AWS EC2Λىಈ, S3ͷόέοτ࡞੒.etc - FYI: IBM͕HashiCorpࣾΛങऩ (2025/3) - HCL(Hashicorp Configuration Language)Ͱهड़ - ϚϧνϓϩόΠμʔରԠ - AWS, Azure, GCPͳͲͷओཁαʔϏεϓϩόΠμʔͩ ͚Ͱ͸ͳ͘ɺKubernetes, Docker, LXD ͳͲ΋α ϙʔτ - .tfϑΝΠϧΛ࡞ͬͯ... planΛ֬ೝͯ͠... apply!
  17. Industry standard multi-distribution method for cloud instance initialization  2-4.

    cloud-init - LXDΛར༻ͯ͠؆୯ʹίϯςφΛݐͯΒΕͨ - ॳظઃఆ͸? Ϣʔβ࡞੒͸? ssh伴ొ࿥͸? खಈ!? Ϛδ!? - cloud-initͱ͸? - YAMLͰఆٛͨ͠ϢʔβσʔλΛड͚औΓɺΠϯελϯεͷηοτΞοϓΛߦ͑Δ - ϓϩόΠμʔ͔Βఏڙ͞ΕΔϝλσʔλΛݩʹॲཧΛߦ͏͜ͱ΋Մೳ - ͪ͜Β΋Canonical੡ - ͍ΖΜͳLinuxσΟετϦϏϡʔγϣϯͰ࢖͑Δ - cloudbase-initΛ࢖͏ͱwindows΋ରԠͰ͖Δ Docs: https://cloudinit.readthedocs.io/
  18. Industry standard multi-distribution method for cloud instance initialization  2-4.

    cloud-init - LXDΛར༻ͯ͠؆୯ʹίϯςφΛݐͯΒΕͨ - ॳظઃఆ͸? Ϣʔβ࡞੒͸? ssh伴ొ࿥͸? खಈ!? Ϛδ!? - cloud-initͱ͸? - YAMLͰఆٛͨ͠ϢʔβσʔλΛड͚औΓɺΠϯελϯεͷηοτΞοϓΛߦ͑Δ - ϓϩόΠμʔ͔Βఏڙ͞ΕΔϝλσʔλΛݩʹॲཧΛߦ͏͜ͱ΋Մೳ - ͪ͜Β΋Canonical੡ - ͍ΖΜͳLinuxσΟετϦϏϡʔγϣϯͰ࢖͑Δ - cloudbase-initΛ࢖͏ͱwindows΋ରԠͰ͖Δ Docs: https://cloudinit.readthedocs.io/ ύοέʔδͷࣗಈΞοϓσʔτ ύοέʔδͷΠϯετʔϧ 5; MPDBMFͷઃఆ Ϣʔβͷ࡞੒ ίϚϯυ࣮ߦ https://cloudinit.readthedocs.io/en/latest/reference/modules.html • ModuleΛॱʹॻ͍͍ͯ͘
  19. - ࣄલ४උ - TerraformΛ࣮ߦ͢ΔϚγϯ͔ΒαʔόΛૢ࡞Ͱ͖ΔΑ͏ʹ͍ͨ͠ - LxdͷΫϥΠΞϯτϥΠϒϥϦ(lxc)ΛΠϯετʔϧ - `brew install lxc`ͰOK

    - LXD DaemonͱLXC͸HTTPS্ͷREST APIͰ௨৴͢ΔͨΊɺηοτΞοϓ͕ඞཁ LXDͷϦϞʔτAPIೝূ  3. ࣮ફ - LXDͱLXC
  20. - ࣄલ४උ - LxdͷΫϥΠΞϯτϥΠϒϥϦ(lxc)ΛΠϯετʔϧ - `brew install lxc`ͰOK - LXD

    DaemonͱLXC͸HTTPS্ͷJSONͰ௨৴͢ΔͨΊɺ伴ϖΞΛൃߦ͢Δඞཁ͕͋Δ - `lxc remote add [IP|FQDN|URL|token]` - https://lxd-ja.readthedocs.io/ja/latest/authentication/ LXDͷϦϞʔτAPIೝূ  3. ࣮ફ - LXDͱLXC MacBook αʔό (LXD Daemon) 1. [PC] ϦϞʔταʔό௥Ճ 2. [Server] τʔΫϯൃߦ 3. [PC] σϑΥϧτϦϞʔτ มߋ 4. [PC] ϦϞʔτͱૄ௨ͯ͠ ͍Δ͜ͱΛ֬ೝ
  21. - `terraform-lxd/lxd` ProviderΛར༻͢Δ - TerraformΛ࣮ߦ͢ΔϚγϯ͔ΒݟͨLXDͷAddressΛઃఆ - طଘͷLXDίϯςφΛTerraformʹॻ͖ى͍ͨ͜͠ - खಈͰॻ͖ى͜͢ͷ͸໘౗ -

    TerraformʹࣗಈͰॻ͖ىͤ͜͞Δ͜ͱ͕Ͱ͖Δ [EXPERIMENTAL] - cf. Import existing resources overview: https://developer.hashicorp.com/ terraform/cli/import  ※ terraformੜ੒͞ΕΔϑΝΠϧ͸ɺ࠶ݱੑ͕ແ͍͜ͱʹ஫ҙ͢Δඞཁ͕͋Δ ɾimport࿙Ε͕ൃੜͨ͠Γɺ҉໧తͳґଘؔ܎ʹؾͮ͘͜ͱ͕Ͱ͖ͳ͍ 3. ࣮ફ - Terraform طଘͷΠϯελϯε৘ใΛTerraformʹॻ͖ग़͢
  22. - طଘͷLXDίϯςφΛTerraformʹॻ͖ى͍ͨ͜͠ - खಈͰॻ͖ى͜͢ͷ͸໘౗ - `terraform import`ίϚϯυ͕࢖͑Δ - cf. Import

    existing resources overview: https://developer.hashicorp.com/ terraform/cli/import  ※ terraform importίϚϯυͰੜ੒͞ΕΔϑΝΠϧ͸ɺ࠶ݱੑ͕ແ͍͜ͱʹ஫ҙ͢Δඞཁ͕͋Δ ɾimport࿙Ε͕ൃੜͨ͠Γɺ҉໧తͳґଘؔ܎ʹؾͮ͘͜ͱ͕Ͱ͖ͳ͍ 3. ࣮ફ - Terraform طଘͷΠϯελϯε৘ใΛTerraformʹॻ͖ग़͢ 1. ImportϒϩοΫΛॻ͍ͯ͋͛Δ 2. `terraform plan -generate- config-out=generated.tf`Λ࣮ ߦ 3. ੜ੒͞ΕͨtfϑΝΠϧΛ֬ೝ 4. terraform plan͢Δ ^ `Plan: [x] to import`ͱग़ͯ ϑΝΠϧ͕ੜ੒͞ΕΔ ੜ੒͞ΕͨϑΝΠϧ
  23. Terraform + cloud-initͰࣗ୐αʔόͷLXDΛIaC͢Δ͓࿩  ·ͱΊ - ҰՈʹҰ୆ɺࣗ୐αʔόΛ... - ʮࣗ୐αʔό͕͋Δͱɺͪΐͬͱݏͳ͜ͱ͕͋ͬͯ΋ʰ·͋ՈʹؼΕ͹αʔό͋Δ͠ͳʱͬͯͳΔ͠ɺʰࢲ ͸ࣗ୐ͰαʔόͱΑΖ͘͠΍͍ͬͯΔ਎ͩͧʱͬͯͳΕΔɻʯ

    - ৗ࣌ಈ͔͓͖͍ͯͨ͠ιϑτ΢ΣΞΛ͍ͭͰ΋௥Ճྉۚͳ͠Ͱಈ͔ͤΔ - Linuxͷ஌͕͍ࣝͭͯΦτΫ - IaC͸ࢥ͍ͬͯͨΑΓָ͔ͬͨ͠ - ΋ͬͱେมͩͱࢥ͍͕ͬͯͨɺ͢ΜͳΓ࣮૷Ͱ͖ͨ - ͲΜͳߏ੒͔ͩͬͨࢥ͍ग़ͤͳͯ͘΋ɺίʔυΛݟΕ͹OK - AIʹίʔυΛॻ͔ͤͯɺPRϚʔδͰ৽͍͠αʔϏεΛಈ͔ͤΔ - ࠓޙͷల๬ - GitHub Actions Self Hosted RunnerΛ(ϦΫΤετ͕͋ͬͨ࣌ʹ)LXD্ͰҰ࣌ΠϯελϯεΛ࡞੒ - Cloudflare Tunnel, DNS΋IaC͍ͯ͋͛ͨ͠ - ͦ͏͢Ε͹ɺWebαΠτ,APIެ։·ͰҰൃ!
  24.  ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠! - ࠙਌ձͰTerraformͷTipsͱ͔͋ͬͨΒͥͻڭ͍͑ͯͩ͘͞! - ࢀߟࢿྉ - ੜϋϜݪ໦: https://x.com/flowertoman/status/1148183345387335680 -

    cloud-init: https://cloudinit.readthedocs.io/ - lxd: https://lxd.readthedocs.io/ - terraform: https://developer.hashicorp.com/terraform - terraform-provider—lxd: https://registry.terraform.io/providers/terraform- lxd/lxd - ίʔυ - https://github.com/YumNumm/rx2530-infra: ͦͷ͏ͪPrivateʹ͠·͢