diff --git a/infra/terraform/.gitignore b/infra/terraform/.gitignore new file mode 100644 index 00000000..69a26221 --- /dev/null +++ b/infra/terraform/.gitignore @@ -0,0 +1,37 @@ +.DS_Store + +### Terraform template +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc diff --git a/infra/terraform/cloudflare/envs/main/.terraform.lock.hcl b/infra/terraform/cloudflare/envs/main/.terraform.lock.hcl new file mode 100644 index 00000000..73eec40e --- /dev/null +++ b/infra/terraform/cloudflare/envs/main/.terraform.lock.hcl @@ -0,0 +1,25 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/cloudflare/cloudflare" { + version = "4.21.0" + constraints = "~> 4.0" + hashes = [ + "h1:gn0+26TFtCwrXn4TM/Kr5d6u4TnWYS0FDVAx8gwnDVs=", + "zh:35b80c29ba47dd843f4281903389a519e90406efe1fd440f704d3a8ccf5a8338", + "zh:5af1ff1d13c7e91cd7e5382000b8f25bdd437ae3b73895b5876eb556352baf65", + "zh:5cc5418817c766af16e2ca9f23ddf3bbdd3c7f5e1a65756ed6f010c75005493e", + "zh:61655486cf10f65367f2bdc53701edb95a068859d54d30050d5028f5028f762d", + "zh:6a6d09d78442b4177e768ddeecc2cd9807bea839ce660e6771df96ff33c34f10", + "zh:6e56c6db96fb87a3a150a28588aa8ed430ef165ca3fde9ad873d40fad1f19021", + "zh:72ab4b2ebc3e06d045b28fcf9156577c7c685fe8445154888aeda74a767b0666", + "zh:78aa9402a1dc8a1c545355a63f6f64a7585ac8cb85ea1f4ef2d63919b8ea9864", + "zh:7c337f94a1ebe35ca5aa8f36d11bea114a8baa09030036c3875c99595e6a3059", + "zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f", + "zh:91c8a229a39bb3b79766da6ad77bdd18afa1fadeb811129de64a8c40a15708eb", + "zh:a8cdad0dbea2528b716138d0e123ced7a676d24a785f7c27c14fe199f0e5d67a", + "zh:a982d06804e3abd4d50d09df3e6926253b43c86767b5d5fb69396ca479aecaff", + "zh:e1a2f880282aaa47344fda83c9f75dd3a317d152388adf1155c7aed3e12cb7a7", + "zh:e64bb1d0199d492535b0825527b01ca42039804cf3903f583976486c40d5328e", + ] +} diff --git a/infra/terraform/cloudflare/envs/main/main.tf b/infra/terraform/cloudflare/envs/main/main.tf new file mode 100644 index 00000000..f924c9a9 --- /dev/null +++ b/infra/terraform/cloudflare/envs/main/main.tf @@ -0,0 +1,17 @@ +locals { + service = "jetdisc" + env = "main" +} + +module "app" { + providers = { + cloudflare = cloudflare + } + + source = "../../modules/app" + service = local.service + env = local.env + account_id = var.account_id + zone_id = var.zone_id + base_domain = var.base_domain +} diff --git a/infra/terraform/cloudflare/envs/main/providers.tf b/infra/terraform/cloudflare/envs/main/providers.tf new file mode 100644 index 00000000..344ab852 --- /dev/null +++ b/infra/terraform/cloudflare/envs/main/providers.tf @@ -0,0 +1,3 @@ +provider "cloudflare" { + api_token = var.cloudflare_api_token +} diff --git a/infra/terraform/cloudflare/envs/main/variables.tf b/infra/terraform/cloudflare/envs/main/variables.tf new file mode 100644 index 00000000..4024c0fa --- /dev/null +++ b/infra/terraform/cloudflare/envs/main/variables.tf @@ -0,0 +1,19 @@ +variable "cloudflare_api_token" { + description = "Cloudflare APIトークン" + type = string +} + +variable "account_id" { + description = "Cloudflare Account ID" + type = string +} + +variable "zone_id" { + description = "Cloudflare Zone ID" + type = string +} + +variable "base_domain" { + description = "Base domain" + type = string +} diff --git a/infra/terraform/cloudflare/envs/main/versions.tf b/infra/terraform/cloudflare/envs/main/versions.tf new file mode 100644 index 00000000..cf3ed20c --- /dev/null +++ b/infra/terraform/cloudflare/envs/main/versions.tf @@ -0,0 +1,10 @@ +terraform { + required_version = "1.6.6" + + required_providers { + cloudflare = { + source = "cloudflare/cloudflare" + version = "~> 4.0" + } + } +} diff --git a/infra/terraform/cloudflare/modules/app/main.tf b/infra/terraform/cloudflare/modules/app/main.tf new file mode 100644 index 00000000..e3fbc97c --- /dev/null +++ b/infra/terraform/cloudflare/modules/app/main.tf @@ -0,0 +1,8 @@ +module "worker" { + source = "./modules/workers" + worker_script_path = "./scripts/worker.js" + account_id = var.account_id + worker_name = "${var.service}-${var.env}" + zone_id = var.zone_id + base_domain = var.base_domain +} diff --git a/infra/terraform/cloudflare/modules/app/modules/workers/main.tf b/infra/terraform/cloudflare/modules/app/modules/workers/main.tf new file mode 100644 index 00000000..c439e8aa --- /dev/null +++ b/infra/terraform/cloudflare/modules/app/modules/workers/main.tf @@ -0,0 +1,23 @@ +locals { + worker_script_dir = "${path.module}/scripts" +} + +resource "cloudflare_worker_script" "worker" { + account_id = var.account_id + name = var.worker_name + content = file("${local.worker_script_dir}/worker.js") +} + +resource "cloudflare_worker_route" "name" { + pattern = "${var.worker_name}.${var.base_domain}" + zone_id = var.zone_id + script_name = cloudflare_worker_script.worker.name +} + +resource "cloudflare_worker_domain" "custom_domain" { + hostname = "${var.worker_name}.${var.base_domain}" + account_id = var.account_id + service = var.worker_name + zone_id = var.zone_id + depends_on = [cloudflare_worker_script.worker] +} diff --git a/infra/terraform/cloudflare/modules/app/modules/workers/scripts/worker.js b/infra/terraform/cloudflare/modules/app/modules/workers/scripts/worker.js new file mode 100644 index 00000000..4f127021 --- /dev/null +++ b/infra/terraform/cloudflare/modules/app/modules/workers/scripts/worker.js @@ -0,0 +1,41 @@ +// @ts-check + +addEventListener('fetch', event => { + event.respondWith(handleRequest(event.request)); +}); + +async function handleRequest(request) { + const url = new URL(request.url); + const code = url.searchParams.get('code'); + + if (!code) { + return new Response('No code found in URL.', { status: 400 }); + } + + // HTMLレスポンスを生成 + const htmlContent = ` + + + Spotify Auth Code + + +

Your Spotify Authentication Code

+

Copy and paste this code back into your Discord chat:

+
+ ${code} +
+ + + + + `; + + return new Response(htmlContent, { + headers: { 'Content-Type': 'text/html' }, + }); +} diff --git a/infra/terraform/cloudflare/modules/app/modules/workers/variables.tf b/infra/terraform/cloudflare/modules/app/modules/workers/variables.tf new file mode 100644 index 00000000..6155c6cd --- /dev/null +++ b/infra/terraform/cloudflare/modules/app/modules/workers/variables.tf @@ -0,0 +1,24 @@ +variable "worker_name" { + description = "Name of Cloudflare Worker" +} + +variable "worker_script_path" { + description = "Path to Cloudflare Worker script" + type = string + default = "./scripts/worker.js" +} + +variable "account_id" { + description = "Cloudflare Account ID" + type = string +} + +variable "zone_id" { + description = "Cloudflare Zone ID" + type = string +} + +variable "base_domain" { + description = "Base domain" + type = string +} diff --git a/infra/terraform/cloudflare/modules/app/modules/workers/versions.tf b/infra/terraform/cloudflare/modules/app/modules/workers/versions.tf new file mode 100644 index 00000000..cf3ed20c --- /dev/null +++ b/infra/terraform/cloudflare/modules/app/modules/workers/versions.tf @@ -0,0 +1,10 @@ +terraform { + required_version = "1.6.6" + + required_providers { + cloudflare = { + source = "cloudflare/cloudflare" + version = "~> 4.0" + } + } +} diff --git a/infra/terraform/cloudflare/modules/app/variables.tf b/infra/terraform/cloudflare/modules/app/variables.tf new file mode 100644 index 00000000..170b1d2e --- /dev/null +++ b/infra/terraform/cloudflare/modules/app/variables.tf @@ -0,0 +1,24 @@ +variable "service" { + type = string + description = "used for resource name and tag prefix" +} + +variable "env" { + type = string + description = "used for resource name and tag prefix" +} + +variable "account_id" { + description = "Cloudflare Account ID" + type = string +} + +variable "zone_id" { + description = "Cloudflare Zone ID" + type = string +} + +variable "base_domain" { + description = "Base domain" + type = string +} diff --git a/infra/terraform/cloudflare/modules/app/versions.tf b/infra/terraform/cloudflare/modules/app/versions.tf new file mode 100644 index 00000000..cf3ed20c --- /dev/null +++ b/infra/terraform/cloudflare/modules/app/versions.tf @@ -0,0 +1,10 @@ +terraform { + required_version = "1.6.6" + + required_providers { + cloudflare = { + source = "cloudflare/cloudflare" + version = "~> 4.0" + } + } +}