Google Cloud Run に TypeScript プロジェクトをデプロイする方法

# はじめに
Google Cloud Run は、Docker コンテナをサポートするスケーラブルな完全マネージド型のサービスです。この記事では、TypeScript で作成したプロジェクトをどのようにして Cloud Run にデプロイするかを解説します。

# 前提条件
デプロイするためには、以下の準備が必要です。
1. Google Cloud アカウント
2. インストール済みのツール: Node.js、TypeScript、Docker、Google Cloud SDK
3. Docker と Cloud Run の基本的な知識

# ① TypeScript プロジェクトのセットアップ
まず、簡単な TypeScript プロジェクトを作成します。
```
mkdir my-cloud-run-app
cd my-cloud-run-app
npm init -y
npm install typescript ts-node express
npx tsc --init
```
次に、簡単な Express サーバーを src/index.ts に作成します。
```typescript
import express from 'express';

const app = express();
const port = process.env.PORT || 8080;

app.get('/', (req, res) => {
  res.send('Cloud Run からこんにちは！');
});

app.listen(port, () => {
  console.log(`サーバーはポート ${port} で稼働中です`);
});
```
# ② アプリケーションの Docker 化
次に、アプリケーションをコンテナ化するための Dockerfile を作成します。

```dockerfile:Dockerfile
# Node.js ベースイメージを使用
FROM node:18

# 作業ディレクトリを設定
WORKDIR /usr/src/app

# package.json をコピーして依存関係をインストール
COPY package*.json ./
RUN npm install

# プロジェクトファイルをコピー
COPY . .

# TypeScript ファイルをビルド
RUN npm run build

# ポートを公開
EXPOSE 8080

# サーバーを起動
CMD ["node", "dist/index.js"]
```

# ③ Docker でのローカルビルドとテスト
Docker イメージをビルドします。
```bash
docker build -t my-cloud-run-app .
```
ローカルでアプリをテストします。
```bash
docker run -p 8080:8080 my-cloud-run-app
```
ブラウザで http://localhost:8080 にアクセスして、アプリが動作していることを確認します。

# ④ GCPへのイメージのプッシュ
まず、Docker を Google Cloud と認証します。
```
gcloud auth configure-docker
```
次に、Docker イメージをタグ付けして、Google Container Registry にプッシュします。

```bash
docker tag my-cloud-run-app gcr.io/[PROJECT_ID]/my-cloud-run-app
docker push gcr.io/[PROJECT_ID]/my-cloud-run-app
```

# ⑤ Cloud Run へのデプロイ
Cloud Run にデプロイするには、2つの方法があります。1つは Dockerfile を使って手動でビルド・プッシュする方法、もう1つは --source オプションを使ってソースコードから直接デプロイする方法です。

### 1. Docker イメージ
Docker イメージを使用して Cloud Run にアプリケーションをデプロイします。
```bash
gcloud run deploy my-cloud-run-app --image gcr.io/PROJECT_ID/my-cloud-run-app --platform managed --region REGION --allow-unauthenticated
```
デプロイが完了すると、アプリケーションの URL が生成されます。

### 2. --source オプション
より簡単な方法として、--source オプションを使って、ローカルのソースコードを直接 Google Cloud Build でコンテナ化し、そのまま Cloud Run にデプロイすることも可能です。この方法では、Dockerfile がなくても自動でビルドが行われます。
```bash
gcloud run deploy my-cloud-run-app --source . --platform managed --region REGION --allow-unauthenticated
```
この方法では、手動で Docker イメージをビルドしてプッシュするステップを省略でき、デプロイ手順が簡略化されます。

### 2つの方法の違い
1. **Docker イメージを使用する方法**
Dockerfile を使ってビルドプロセスを完全に制御したい場合や、特定の依存関係が必要な場合に適しています。この方法では、手動でビルドとプッシュを行うため、柔軟性があります。

2. **--source オプションを使用する方法**
素早くデプロイしたい場合や、Dockerfile を用意する時間を短縮したい場合には、この方法が便利です。Google Cloud Build にビルドを任せるため、手軽にデプロイが行えますが、ビルドに対するカスタマイズは制限されます。

:::note info
デプロイのコマンドをpackage.jsonに登録すれば便利です。
```json:package.json
{
  "scripts": {
    "deploy": "gcloud run deploy my-cloud-run-app --source . --platform managed --region REGION --allow-unauthenticated"
  }
}
```
:::

# ⑥ デプロイのテスト
デプロイ後、GCPコンソールのCloud Runにサービスが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/fbb83097-6ca8-950a-b2dd-d925c263b855.png)

サービス名をクリックすると、URLが表示されます。セキュリティにAuthenticationを下記にしてください。
→Allow unauthenticated invocations
Check this if you are creating a public API or website.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/6c361175-e449-c727-ea63-41782a9ca6d1.png)

提供された URL を開いて、アプリケーションが Cloud Run 上で正常に動作していることを確認します。

# まとめ
Google Cloud Run を使えば、TypeScript プロジェクトを簡単にデプロイすることができます。さらに、--source オプションを使えば、手軽にデプロイを行うことができ、従来の Dockerfile を使用した手動ビルドによるデプロイと使い分けることで、柔軟かつ効率的な開発フローを実現できます。