GAミント至上主義

Web Monomaniacal Developer.

このブログについて(先頭固定)

【お約束】 投稿内容は個人の見解であり、所属する(していた)組織の公式見解ではありません。

名前:uyamazak(昔いた会社で上司が開発用Linuxサーバーのユーザー名に「yuyamazaki」が長いので勝手に作ってくれた。読み方わからないけどウヤマザク)

高校あたりからWEBサイトをやったり趣味の延長でWEB系を仕事にした感じの人間。

2020年1月から株式会社シニアジョブにジョイン。
2021/1現在、まだ開発者は3人、これからの会社なのでビジネス貢献しつつ、きれいな設計をしたい

アズールレーン@竹敷でモバイルのUI、UX研究中(初嫁ジャベリン)
フレンド&大艦隊メンバー募集してます ID:939524678 @竹敷



GitHub: https://github.com/uyamazak/

これまでの主なプロジェクト

続きを読む

CircleCI Orb + Cloud BuildでArtifact Registryにイメージをプッシュする際にタグにコミットハッシュを使う

CircleCIでCloud Runにデプロイする際、下記のOrbを使ったけどトリガー経由ではないので、コミットハッシュをCloud Build側で使うのがちょっとややこしかったのでメモ。
CircleCIから--substitutions を使って渡す必要がありました。

CircleCI Developer Hub - circleci/gcp-cloud-run


config.yml

version: 2.1
orbs:
  gcp-cloud-run: circleci/gcp-cloud-run@1.0.2

// 省略
jobs:
  deploy-server:
    docker:
      - image: 'cimg/base:stable'
    steps:
      - checkout
      - gcp-cloud-run/init:
          gcloud-service-key: GCLOUD_SERVICE_KEY
          google-project-id: GOOGLE_PROJECT_ID
      - gcp-cloud-run/build:
          args: --substitutions=COMMIT_SHA=${CIRCLE_SHA1}
          config: ./cloudbuild.yml
// 省略

GCLOUD_SERVICE_KEY、GOOGLE_PROJECT_IDは環境変数

モノレポ構成でDockerfileの場所を変えるためcloudbuild.ymlを使用しています。

上記の設定でCOMMIT_SHAを渡したのでCloud Build側で使えるようになっています。

cloudbulld.yml

steps:
  - id: "build the container image"
    name: "gcr.io/cloud-builders/docker"
    args: ["build", "-t", "location-docker.pkg.dev/${PROJECT_ID}/api/image-name:${COMMIT_SHA}", "-f", "./Dockerfiles/api/Dockerfile", "."]

  - id: "push container image"
    name: "gcr.io/cloud-builders/docker"
    args: ["push", "location-docker.pkg.dev/${PROJECT_ID}/api/image-name:${COMMIT_SHA}"]

タグ名もArtifact Registryの設定よります。
https://cloud.google.com/artifact-registry?hl=ja


COMMIT_SHA以外を使いたい場合はこちら
https://cloud.google.com/build/docs/build-config-file-schema#substitutions

JavaScript (TypeScript) のMapをObjectに変換する

TypeScriptで素のObjectよりMapの方がTypeScriptと相性がよく使う機会が増えてきたけど、レスポンスに変換するときなどはObjectに変換する必要があったのでメモ。

ぐぐったらreduceとか使う古いのが検索上位に出てきてしまうが、
Map.prototype.entries()Object.fromEntries()に渡すというシンプルな組合わせでできる。

Map - JavaScript | MDN

Object.fromEntries() - JavaScript | MDN

以下はChromeのconsoleなのでJavaScriptで試したけどTypeScriptでも同じようにできる。

const map = new Map()
>undefined
map.set(1, 'one')
>Map(1) {1 => 'one'}
map.set(2, 'two')
>Map(2) {1 => 'one', 2 => 'two'}
map.set(3, 'three')
>Map(3) {1 => 'one', 2 => 'two', 3 => 'three'}
map.entries()
>MapIterator {1 => 'one', 2 => 'two', 3 => 'three'}
Object.fromEntries(map.entries())
>{1: 'one', 2: 'two', 3: 'three'}

reduced使うやつ
https://qiita.com/mktoho-n/items/6b96674c9c7ba542d2be

CircleCIからCloud Runにデプロイするときにハマった3つのエラー

CircleCIを使っていてCloud Runが必要になったので設定したけど、いくつかハマったのでメモ

前提

この公式Orbsを使用する。

CircleCI Developer Hub - circleci/gcp-cloud-run

.circleci/config.ymlはこんな感じ。本番でなくステージング環境を作ってるので環境変数は変えてある。

version: 2.1
orbs:
  gcp-cloud-run: circleci/gcp-cloud-run@1.0.2

jobs:
// 省略
  deploy-cloud-run-staging:
    docker:
      - image: 'cimg/base:stable'
    steps:
      - checkout
      - gcp-cloud-run/init:
          gcloud-service-key: GCLOUD_SERVICE_KEY_STAGING
          google-project-id: GOOGLE_PROJECT_ID_STAGING
      - gcp-cloud-run/build:
          config: ./cloudbuild.yml

GCPのプロジェクトでサービスアカウントを作り、キーやプロジェクトIDなどはCircleCIの環境変数に設定済み。

今回モノレポなプロジェクトでDockerfileの場所とコンテキストの場所が異なるけど、Orbの設定ではできなさそうだったので、cloudbuild.ymlが必要になった。

シンプルにビルド、プッシュ、デプロイの3アクション。

cloudbuild.yml

steps:
  - id: "build the container image"
    name: "gcr.io/cloud-builders/docker"
    args: ["build", "-t", "gcr.io/${PROJECT_ID}/api-staging:${BUILD_ID}", "-f", "./Dockerfiles/api/Dockerfile", "."]

  - id: "push container image"
    name: "gcr.io/cloud-builders/docker"
    args: ["push", "gcr.io/${PROJECT_ID}/api-staging:${BUILD_ID}"]

  - id: "deploy to Cloud Run"
    name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: gcloud
    args: ['run', 'deploy', 'api-staging', '--image', 'gcr.io/${PROJECT_ID}/api-staging:${BUILD_ID}', '--region', 'asia-northeast1']

Cloud Buildは成功しているのにCircleCIでエラー

ログを表示しようとしてるのにサービスアカウントに権限がなくてエラーになってる模様。

Uploading tarball of [.] to [gs://********************_cloudbuild/source/*****************.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/********************/locations/global/builds/*****************.].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/*****************?project=************].
ERROR: (gcloud.builds.submit) 
The build is running, and logs are being written to the default logs bucket.
This tool can only stream logs if you are Viewer/Owner of the project and, if applicable, allowed by your VPC-SC security policy.

The default logs bucket is always outside any VPC-SC security perimeter.
If you want your logs saved inside your VPC-SC perimeter, use your own bucket.
See https://cloud.google.com/build/docs/securing-builds/store-manage-build-logs.


Exited with code exit status 1
CircleCI received exit code 1

よく読むと答えが書いてあり

This tool can only stream logs if you are Viewer/Owner of the project

プロジェクトのオーナーか参照の権限をサービスアカウントに追加が必要。もちろん参照でいいので追加して解決。

Cloud Buildのログを出すだけなのに、プロジェクト全体が必要とはちょっと大げさな権限だなぁ。

Cloud Runにデプロイ時に権限かサービスがなくてエラー1

Step #2 - "deploy to Cloud Run": gcr.io/google.com/cloudsdktool/cloud-sdk:latest
Step #2 - "deploy to Cloud Run": ERROR: (gcloud.run.deploy) PERMISSION_DENIED: Permission 'run.services.get' denied on resource 'namespaces/********************/services/api-staging' (or resource may not exist).
Finished Step #2 - "deploy to Cloud Run"
ERROR
ERROR: build step 2 "gcr.io/google.com/cloudsdktool/cloud-sdk" failed: step exited with non-zero status: 1


BUILD FAILURE: Build step failure: build step 2 "gcr.io/google.com/cloudsdktool/cloud-sdk" failed: step exited with non-zero status: 1
ERROR: (gcloud.builds.submit) build bc02f3af-d341-4af1-98cb-0e2d396078a4 completed with status "FAILURE"

単純に最初なのでCloud Runのサービスが存在しない。

最初は手作業でサービス作って解決、と思ったらだめだった。

こちらを参考にCloud BuildのサービスアカウントにCloud RunのAdminをつけて解決するはず、と思ったらだめだった。 stackoverflow.com

Cloud Runにデプロイ時に権限かサービスがなくてエラー2

1をやったらエラーが変わった。

Step #2 - "deploy to Cloud Run": ERROR: (gcloud.run.deploy) PERMISSION_DENIED: Permission 'iam.serviceaccounts.actAs' denied on service account *****-compute@developer.gserviceaccount.com (or it may not exist).

ググると解決策が出てくるけどiam.serviceaccounts.actAsが見つからない。 stackoverflow.com

ロール作成画面でフィルタするも出てこないのでiamだけでフィルタし、ページ送りしまくったらやっとみつかったので、カスタムロールを作成。 f:id:uyamazak:20220107111632p:plain

Cloud Buildでイメージのタグにコミットハッシュが使えなくてエラー

昔作った設定を参考に、イメージのバージョンに$COMMIT_SHAなどを使っていたけど、今回はGitレポジトリのフックではなくコマンド経由なせいか存在せず、空白になってしまいエラー。

Already have image (with digest): gcr.io/cloud-builders/docker
invalid argument "gcr.io/*****api-staging:" for "-t, --tag" flag: invalid reference format
See 'docker build --help'.

Substituting variable values  |  Cloud Build Documentation  |  Google Cloud

にある通り、絶対に使えるのは下記3つだけで、ビルドごとに異なるのはBuild IDだけなので必然的にそれを使うことにして解決。

$PROJECT_ID: Cloud プロジェクトの ID

$BUILD_ID: ビルドの ID

$PROJECT_NUMBER: プロジェクトの番号