Slide 1

Slide 1 text

Cloudflare Meetup Nagano Vol.2 2023.10.14 Sat. Taisei Ito kaedemalu 𝕏 kaedemalu

Slide 2

Slide 2 text

自己紹介 ● 伊藤 太斉(Taisei Ito) ○ @kaedemalu(X, GitHub) ○ フューチャー株式会社 ■ Technology Innovation Group ■ シニアコンサルタント ○ #Terraform #Google Cloud #AWS ● Community ○ GCPUG Shonan Staff ● Like ○ サウナ・スキー・カメラ・ロードバイク

Slide 3

Slide 3 text

Agenda ● 話そうと思っていること ※詳細については以下ブログを確認してください cf-terraformingで入門するCloudflare

Slide 4

Slide 4 text

Agenda ● 話そうと思っていること ※詳細については以下ブログを確認してください cf-terraformingで入門するCloudflare

Slide 5

Slide 5 text

Agenda ● 話そうと思っていること ○ Terraformについて ○ CloudflareとTerraform ○ TerraformerからみたCloudflare ● 話さないこと ○ CloudflareにおけるTerraformのベストプラクティス

Slide 6

Slide 6 text

Infrastructure as Code (IaC) ● インフラリソースをコードで管理する時代 ○ 開発の高速化・変化に耐えうる必要が出てきた ● クラウドサービスが発展し、より複雑に絡み合うモダンインフラには 「設定の明文化」が必要 ● IaCに挙げられるメリットは以下である ○ Reusability(再利用性) ○ Portability(可搬性) ○ Automation(自動化) ● IaCのツール例 ○ Ansible ○ Cloud Formation ○ Deployment Manager

Slide 7

Slide 7 text

Terraformとは ● HashiCorp社が開発しているOSS ○ インフラをソースコードで定義するツール ■ InfraStructure as Code(IaC)ツールである ○ HashiCorp Configuration Language(HCL)で記載する ○ 拡張子は .tf で定義する ○ 最近、Terraformのv1.6がGAになった

Slide 8

Slide 8 text

Terraformのコンポーネント ● ソースコード ○ 開発者がHCLで記述するファイル ● Provider ○ ソースコードをクラウドに適用するために必要 ■ クラウドに向けてリクエストを投げる ● State ○ クラウドリソースの「あるべき」が書かれるファイル ○ 自分で触ることは基本しない ○ 管理はストレージサービス (S3, GCS etc…)に配置して管理する

Slide 9

Slide 9 text

Terraformのコンポーネント ソースコード Provider State 各種クラウド リソース 差分の同期 差分の比較

Slide 10

Slide 10 text

CloudflareとTerraform ● CloudflareもTerraformで管理することが可能 ● プロバイダーは現在Cloudflareで開発している ○ cloudflare/terraform-provider-cloudflare ○ コミット、リリースも積極的に行われている ● cf-terraformingというツールがCloudflareにて開発されている ○ cloudflare/cf-terraforming ● ストレージサービスでのState管理 ○ R2で管理は現在できない ■ Issue: Support Cloudflare r2 for storing Terraform state #33847

Slide 11

Slide 11 text

Cloudflare内部でTerraformの管理を完結させてみたいと思った

Slide 12

Slide 12 text

Stateを管理するときの例 ● いずれかのストレージサービスでStateを管理するとき、以下のように書く ex.) S3で管理する場合 terraform { backend "s3" { bucket = "sample-tfstate" # バケット名 key = "state" # オブジェクトのパスを指定 region = "us-east-1" # バケットのリージョン } }

Slide 13

Slide 13 text

Cloudflareのみで管理を完結するための課題 ● Stateの管理をCloudflareに持っていきたい ○ そうでない場合、S3, GCSなど他のクラウドに管理を委ねることになる

Slide 14

Slide 14 text

Cloudflareのみで管理を完結するための課題 ● 自作 ○ http backendがあり、Stateの挙動に合わせてAPIを準備すればできる可能性が高い ■ Backend: http ● あるもの ○ R2とS3の間でのAPI互換性あり ■ APIの互換性一覧:S3 API compatibility

Slide 15

Slide 15 text

Cloudflareのみで管理を完結するための課題 ● 自作 ○ http backendがあり、Stateの挙動に合わせてAPIを準備すればできそう ■ Backend: http ● あるもの ○ R2とS3の間でのAPI互換性あり ■ APIの互換性一覧:S3 API compatibility

Slide 16

Slide 16 text

調べても出てこないので、やってみた

Slide 17

Slide 17 text

設定していく ● まずは課金の有効化 ○ Stateのみ保存なので無料の範囲内

Slide 18

Slide 18 text

設定していく ● アカウントIDを控える ● APIトークンの作成

Slide 19

Slide 19 text

設定していく ● APIトークンの作成 ○ 出力された以下を控えておく ■ アクセス キーID ■ シークレット アクセス キー

Slide 20

Slide 20 text

設定していく ● R2バケットを作成する

Slide 21

Slide 21 text

設定していく ● 環境変数の設定を行う ※Terraform側でパラメータを扱わないようにするため No. 環境変数名 値 1 AWS_ACCOUNT_ID CloudflareのアカウントID 2 AWS_ACCESS_KEY_ID APIトークンで払い出したアクセスキー ID 3 AWS_SECRET_ACCESS_KEY APIトークンで払い出したシークレット アクセスキー 4 CLOUDFLARE_ACCOUNT_ID CloudflareのアカウントID 5 CLOUDFLARE_API_KEY ユーザーAPIトークンで確認できる Global API Key 6 CLOUDFLARE_API_TOKEN アクセスキー, シークレットアクセスキーと 共に払い出したトークン

Slide 22

Slide 22 text

実際に管理する ● backendの設定を行う ○ ① S3と同様の設定を行う →トークン系のエラー(403) terraform { backend "s3" { bucket = "kaedemalu-tfstate" key = "default.state" region = "us-east-1" } }

Slide 23

Slide 23 text

実際に管理する ● backendの設定を行う ○ ②トークンのバリデーションをスキップするオプションを追加 →アクセスキーがAWSの形式ではないと怒られる(403) terraform { backend "s3" { bucket = "kaedemalu-tfstate" key = "default.state" region = "us-east-1" skip_credentials_validation = true } }

Slide 24

Slide 24 text

実際に管理する ● backendの設定を行う ○ ③ S3のエンドポイントの向き先を指定 →成功した! terraform { backend "s3" { bucket = "kaedemalu-tfstate" key = "default.state" region = "us-east-1" endpoint = "https://.r2.cloudflarestorage.com" skip_credentials_validation = true } }

Slide 25

Slide 25 text

余談 ● us-east-1リージョンはないが、Cloudflare側でautoというリージョンになるようにエ イリアスが貼られている ● Terraformのv1.6からはエンドポイントが以下のようにendpointsブロックになる terraform { backend "s3" { bucket = "kaedemalu-tfstate" key = "default.state" region = "us-east-1" endpoints = { s3 = "https://.r2.cloudflarestorage.com" } skip_credentials_validation = true } }

Slide 26

Slide 26 text

Workersをデプロイしてみる ● Workersのスクリプト Terraform部分 ● 実際に乗せるスクリプト ○ 「Hello World」を出力するスクリプトを公式から拝借 ○ https://developers.cloudflare.com/workers/examples/return-html/ resource "cloudflare_worker_script" "sample_workers" { account_id = "0000000000000000000000" name = "test-cf-workers" content = file("./scripts/workers.js") module = true }

Slide 27

Slide 27 text

Workersをデプロイしてみる ● Terraform経由でデプロイしていることがわかる

Slide 28

Slide 28 text

Workersをデプロイしてみる ● Terraform経由でデプロイしていることがわかる

Slide 29

Slide 29 text

Workersをデプロイしてみる ● ZoneもTerraformで追加(したかった) ● 「workers.dev」ドメインはZone IDを持たないことから利用できない ○ 今回は手動で有効化して以下を確認しました(悔しい resource "cloudflare_worker_route" "sample_workers" { zone_id = "xxxxxxxxx" pattern = "example.com/*" script_name = cloudflare_worker_script.sample_workers.name }

Slide 30

Slide 30 text

Terraformから眺めるCloudflare(クラウド) ● Terraformからリソースを作成する場合、コンソール上では1つのリソース でも複数から構成する必要がある ○ Workersを画面で立ち上げた場合、以下の 2つが同時に作成される ■ Workers本体(スクリプト) ■ ドメインの紐付け ● クラウド側のリソース作成の流れを感じることができる

Slide 31

Slide 31 text

まとめ ● Cloudflare単体でTerraformを利用・管理はできる ○ State管理の方法として正式なサポートはなくても R2で管理可能

Slide 32

Slide 32 text

● 大崎にあるITコンサル会社 ● 経営戦略から実装、運用までを全てこなす ● ベンダーニュートラルの考え方 ● 「ないものは作る」 フューチャーについて

Slide 33

Slide 33 text

● Real World HTTPの著者 ● 実用Go言語の著者たち ● Vue.jsのコミッター ● TomcatのPMCメンバー ● OSS「Vuls」の作成者 こんな人います

Slide 34

Slide 34 text

ブログも出しています

Slide 35

Slide 35 text

参考リンク ● Amazon S3 と API の互換性がある Cloudflare R2 を AWS CLI から使ってみる

Slide 36

Slide 36 text

Cloudflare Meetup Nagano Vol.2 2023.10.14 Sat. Taisei Ito kaedemalu 𝕏 kaedemalu