1
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

SPAサイトをGitHub ActionsでCloud Storageへアップロードする。あとCDNも設定する。

Last updated at Posted at 2024-07-06

はじめに

Google Cloud Platformを使い始めました。

備忘録として、作業の流れを記録していきます。

API有効化の注意

場合によっては、必要なAPIを有効化する必要がありますが、それらは省略しています。

使用するのは、たぶん、Compute Engine APIです。

Vueプロジェクト作成

SPAは何でもいいのですが、今回はVueを使います。

$ npm create vue@latest

プロンプトにメッセージが表示されるので選んでいきます。何を選んでもいいです。

$ cd <your-project>
$ npm i
$ npm run dev

すると、http://localhost:5173/ にこんな画面が表示されます。

image.png

GCPプロジェクト作成

記事の都合上、新しいプロジェクトから作成していきます。

image.png

GitHub Actionsで使用するサービスアカウントを作成

IAMと管理 -> サービスアカウントから、サービスアカウントを作成します。

image.png

名前は、 github-actions にします。

image.png

Storageオブジェクト管理者のロールを付けます。

image.png

アカウントが作成されたら、鍵を作成します。

image.png

鍵を作成します。ここをクリックすると、選択肢のポップアップが表示されますが、JSONタイプのものを使います。そっちじゃないのは使ったことありません。そのあと、鍵の情報が入ったファイルの自動ダウンロードが始まります。

image.png

ファイルはこんな感じです。 公開リポジトリ等にアップロードしてはいけません。

image.png

この内容は、あとでGitHub ActionsのSecretに登録します。

Cloud Storageのバケットを作成

ビルドしたvueアプリをデプロイするためのCloud Storageバケットを作成します。

image.png

名前は vueapp としておきます。

image.png

バケットは公開するので、公開アクセス禁止設定は解除しておきます。後からでも解除できます。

image.png

バケットの公開設定をします。権限タブに行き、アクセス権を付与をクリック。

image.png

allUsersにStorageオブジェクト閲覧者の権限をつけます。これで公開されます。

image.png

ウェブサイトの構成を編集します。

image.png

これにより、 / へのアクセスで index.html が表示されるようになります。

image.png

GitHub Actionsを使ってバケットにデプロイする

プロジェクトにActionsのファイルを用意します。ChatGPTに作ってもらいました。

<your-bucket>のところを、作成したバケット名に変えてください。

.github/workflows/deploy.yml
name: Deploy to Google Cloud Storage

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'

      - name: Install dependencies
        run: npm install

      - name: Build project
        run: npm run build

      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v1
        with:
          credentials_json: ${{ secrets.GCP_SA_KEY }}

      - name: Upload Folder
        uses: google-github-actions/upload-cloud-storage@v2
        with:
          path: dist
          destination: <your-bucket>
          parent: false

上記のファイルで使用した GCP_SA_KEY を、GitHubに登録します。

image.png

これで、Actionsが走って成功すると、アップロードされます。

image.png

ここで、 index.html の詳細を見てみます。公開URLをクリックしてみましょう。

image.png

真っ白なページが表示されます。URLのパス部分がルートでないので、関連ファイルの読み込みに失敗しています。

image.png

解決方法としては、Vueのほうの設定で、相対パスを使うように設定する方法があるかと思いますが、今回はCDNを使ってURLのパス部分がルートになるようにします。

Cloud Storageの前段にCloud Load BalancingとCloud CDNを置く

ロードバランサを作成します。

image.png

いろいろ選択肢がありますが、全部左の選択肢を選びました。

image.png

ロードバランサの構成をしていきます。

フロントエンドの構成です。エフェメラルIPアドレスを使用して、HTTPSを使用します。

image.png

証明書はGCPに作ってもらいます。

image.png

次はバックエンドの構成です。

バックエンドバケットを作成します。

image.png

次の画面で、前に作ったCloud Storageのバケットを指定します。

また、ここでCloud CDNの設定とCloud Armorの設定があります。Cloud CDNは個人開発であっても十分払えるレベルかと思いますので、有効のままで行きます。

Cloud ArmorはWAFです。仕事なら有効にする必要があるかもしれませんが、Cloud StorageのURLでもファイルにアクセスできるので、どのくらい有用なのかわかりません。

image.png

最後にルーティングですが、いまのところバケットしかないので、デフォルトのままです。ここにバックエンドとか追加のバケットが入ってくると、ルーティングを設定する必要があります。

image.png

ロードバランサにドメイン名でアクセスするようDNSの設定をする

ロードバランサが作成された後で、詳細画面を見ます。

そこにロードバランサのIPアドレスが書いてあるのでメモします。

image.png

先のフロントエンドの構成のところで入力したドメインに対して、Aレコードを設定します。

(私はドメイン名を別サービスで管理しているので画面は省略です)

さて、DNS設定が終わった後は、証明書ができるのを待ちます。証明書のことろのリンクをクリックすると、状況がわかります。

image.png

この画面では、PROVISIONINGとなっており、証明書は作成されてないことがわかります。

image.png

30分くらい待つと、ACTIVEになりました。

image.png

設定したドメインでアクセスできるようになる

さて、それではページを開いてみましょう。

image.png

これで、GitHubにプッシュしたら、自動的にGCPへデプロイされる手筈が整いました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0