Open20

キャッチアップしたこと、したいこと

gontagonta

AWSでのcloud front, S3の静的サイトのインフラ構築やったことがあったけど、GCP側も大体同じような感じだった。
次はcloud runとかのコンテナの構築をやりたい。

https://zenn.dev/gonta_ganbareyo/articles/ea457170433b40

gontagonta

SPAの場合にダイレクトURLでアクセスをすると、

GET https://dev.dashboard.my-learn-iac-sample.site/todos 404 (Not Found)

が出る。結構頑張ったら無理な気がしており、一旦スルー対応。awsのS3でやった時は問題なかった気がするが勘違いだろうか。。
こういうの気になるので、時間があるときになんとかしたい。

# Cloud Storageバケット(静的ウェブサイトホスティング)
resource "google_storage_bucket" "dashboard_frontend" {
  name          = var.bucket_name
  location      = var.region
  force_destroy = false # 誤った削除を防ぐ

  # 静的ウェブサイトホスティング用の設定
  website {
    main_page_suffix = "index.html"
    not_found_page   = "index.html" # これだとだめみたい。
  }

  # セキュリティ設定
  public_access_prevention    = "inherited"
  uniform_bucket_level_access = true

  # ラベル設定
  labels = {
    purpose    = "dashboard-frontend"
    managed_by = "terraform"
  }
}

gontagonta

MSW

モックがあんまり好きじゃないので今まで触ってこなかったけど、改めて触っておきたいかも

https://mswjs.io/

gontagonta

Turborepo

gontagonta

Turborepoを扱う上でビルド時間を削除できたらいいなと思っているんだけど、vercelなら楽そうだけど、それ以外となると自前でキャッシュサーバーを作らないといけない。

https://turborepo.com/docs/core-concepts/remote-caching#self-hosting

その時に、記事にあるようにこれを使うことで解決ができるっぽいのでこれをやりたい。

https://zenn.dev/aiji42/articles/7bc1b6df91dd76#truboコマンドから接続する

gontagonta

色々といじって検証をしてみたが、GCSにcacheを入れることができたが、github actionsでなぜかcacheの比較がうまくいかずに毎回同じ値だと見なされてしまう。。

gontagonta

Google DriveのようなUIで複数ファイルタイプの一括アップロードとかをやってみたい

gontagonta

AI OCR

AIで読み取って反映をさせるの自分でプログラム書いときたい。

gontagonta

こんな感じでterraformでディレクトリ設計したけど、微妙だった。

  • gcpという括りは要らなかったかも
  • sharedいらない。
  • dev, prod等の配下にapi, backendとかで分けてけど、リソースを移動をすることが多くて面倒なことが多かった。
  • 小規模前提で考えると基本main.tfだけで良さそう。
.
└── gcp
    └── environments
        ├── CLAUDE.local.md
        ├── dev
        │   ├── api
        │   │   ├── backend.tf
        │   │   ├── cloudrun.tf
        │   │   ├── cloudsql.tf
        │   │   ├── main.tf
        │   │   ├── outputs.tf
        │   │   ├── terraform.tfvars
        │   │   └── variables.tf
        │   ├── backend
        │   │   ├── main.tf
        │   │   ├── outputs.tf
        │   │   ├── terraform.tfstate
        │   │   ├── terraform.tfstate.backup
        │   │   ├── terraform.tfvars
        │   │   └── variables.tf
        │   ├── dashboard
        │   │   ├── backend.tf
        │   │   ├── main.tf
        │   │   ├── outputs.tf
        │   │   ├── terraform.tfvars
        │   │   └── variables.tf
        │   ├── shared
        │   │   ├── apis.tf
        │   │   ├── backend.tf
        │   │   ├── certificate_map.tf
        │   │   ├── firewall.tf
        │   │   ├── iam.tf
        │   │   ├── main.tf
        │   │   ├── network.tf
        │   │   ├── outputs.tf
        │   │   ├── terraform.tfstate.backup
        │   │   ├── terraform.tfvars
        │   │   ├── variables.tf
        │   │   └── workload-identity.tf
        │   └── turbo-cache
        │       ├── backend.tf
        │       ├── main.tf
        │       ├── outputs.tf
        │       ├── terraform.tfvars
        │       └── variables.tf
        └── prod
            ├── api
            │   ├── backend.tf
            │   ├── cloudrun.tf
            │   ├── cloudsql.tf
            │   ├── loadbalancer.tf
            │   ├── main.tf
            │   ├── outputs.tf
            │   ├── terraform.tfvars
            │   └── variables.tf
            ├── backend
            │   ├── main.tf
            │   ├── outputs.tf
            │   ├── terraform.tfstate
            │   ├── terraform.tfstate.backup
            │   ├── terraform.tfvars
            │   └── variables.tf
            ├── dashboard
            │   ├── backend.tf
            │   ├── main.tf
            │   ├── outputs.tf
            │   ├── terraform.tfvars
            │   └── variables.tf
            └── shared
                ├── apis.tf
                ├── backend.tf
                ├── certificate_map.tf
                ├── iam.tf
                ├── main.tf
                ├── network.tf
                ├── outputs.tf
                ├── terraform.tfvars
                ├── variables.tf
                └── workload-identity.tf

gontagonta

terraformとGCP周りのあれこれ

GCPで組織がある。google workfspaceを作ったアカウントでgcpのプロジェクトを作ると勝手に組織の下にできるみたい。こういうことを組織として大元で制御ができるみたい。

具体的なユースケース

  1. セキュリティ強化

❌ 問題: 開発者がService Account Keyを作成してGitにコミット
✅ 解決: 組織全体でService Account Key作成を禁止

  1. コンプライアンス対応

❌ 問題: 機密データが海外リージョンに保存される
✅ 解決: 組織ポリシーで日本リージョンのみ許可

  1. コスト管理

❌ 問題: 高額なVMインスタンスが乱立
✅ 解決: 作成可能なマシンタイプを制限

  1. 運用統制

❌ 問題: 各チームが勝手にネットワーク設定
✅ 解決: VPC作成を管理者のみに制限

gontagonta

terraformで以下のエラーが出た。
なんで?と思ったら、constraints/iam.disableServiceAccountKeyCreationというのが組織の設定であった。
constraintsが組織のポリシーに対してprefixみたい。


│ Error: Error creating service account key: googleapi: Error 400: Key creation is not allowed on this service account.
│ Details:
│ [
│   {
│     "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
│     "violations": [
│       {
│         "description": "Key creation is not allowed on this service account.",
│         "subject": "projects/my-second-dev/serviceAccounts/github-actions-deployer@my-second-dev.iam.gserviceaccount.com?configvalue=github-actions-deployer%40my-second-dev.iam.gserviceaccount.com",
│         "type": "constraints/iam.disableServiceAccountKeyCreation"
│       }
│     ]
│   }
│ ]
│ , failedPrecondition
│ 
│   with module.shared.google_service_account_key.github_actions_key,
│   on ../../modules/shared/main.tf line 148, in resource "google_service_account_key" "github_actions_key":
│  148: resource "google_service_account_key" "github_actions_key" {
│ 
╵
gontagonta

この辺りの組織を使った設定ってそこまでやらなくてもいいかもしれない。

gontagonta

フォルダについても小規模な企業を想定して、あまりフォルダで事業部Aフォルダ, 事業部Bフォルダのようなことは一旦考えずに触れるようになった方が良さそう。
頭がこんがらがる

gontagonta

github で複数のアカウントを使っているときの切り替え

いつも忘れる。

https://zenn.dev/taichifukumoto/articles/how-to-use-multiple-github-accounts

を参考にしている。

下記の設定をしておく、sshkeyを生成をしてgithub側で登録

#メインアカウント
Host github #任意のホスト名
  HostName github.com
  IdentityFile ~/.ssh/id_rsa #メインアカウントの鍵のファイル
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes

#サブアカウント
Host github-sub #任意のホスト名
  HostName github.com
  IdentityFile ~/.ssh/id_sub_rsa #サブアカウントの鍵のファイル
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes

以下のようにしてhost部分を変える。

git clone git@github.com:rakushite-inc/gcp-organization-terraform.git

👇

git clone git@github-sub:rakushite-inc/gcp-organization-terraform.git

cloneをすると成功をする