AWS UserのGCP浮気日記 Day1[コンピュートとRDBMSのVPC内接続]

AWSを愛している身ですが，ついにGCPに浮気をしなくてはいけなくなってしまいました．愛人を作った以上しっかり愛さないと(使い倒さないと)いけないと思ったので浮気日記として**GCPの様子をAWSと比較して考えてみるシリーズ**を開始します．

# IAM AWS User クラウドサービスをフル活用しよう！
AWS(本妻？)のサービスの紹介・考察，使用事例の紹介，オンプレとの比較をするシリーズ

https://qiita.com/JavaLangRuntimeException/items/371a334f5a6e07035db5

# シリーズ AWS UserのGCP浮気日記
Day2 サーバーレスアーキテクチャでのコンピューティングサービス(GCP CloudRun と AWS Lambda)

https://qiita.com/JavaLangRuntimeException/items/13f04678b6d5c8cebd61


# 他のシリーズ
**チートシート**
様々な言語，フレームワーク，ライブラリなど開発技術の使用方法，基本事項，応用事例を網羅し，手引書として記載したシリーズ

https://qiita.com/JavaLangRuntimeException/items/f038fbaccdd92fb0308a

> この記事はSQLのチートシートで，インフラ触るエンジニアならぜひ知っておいた方がいい言語(?)です．
git/gh，lazygit，docker，vim，typescript，プルリクエスト/マークダウン，ステータスコード，ファイル操作，OpenAI AssistantsAPI，Ruby/Ruby on Rails のチートシートがあります．以下の記事に遷移した後，各種チートシートのリンクがあります.

**TypeScriptで学ぶプログラミングの世界**
プログラミング言語を根本的に理解するシリーズ

https://qiita.com/JavaLangRuntimeException/items/cadf49bb419076819963

**情報処理技術者試験合格への道[IP・SG・FE・AP]**
情報処理技術者試験に出題されるコンピュータサイエンス用語の紹介や単語集

https://qiita.com/JavaLangRuntimeException/items/991be402099542ccb936


**Project Gopher: Unlocking Go’s Secrets**
Go言語や標準ライブラリの深掘り調査レポート

https://qiita.com/JavaLangRuntimeException/items/dc45b412d3fbd2ccb9e8


# Day1 今回紹介するアーキテクチャ概要
GCPではCloud Runを用いてコンテナアプリケーションを実行し、VPC内でCloud SQLを安全かつ高速に接続する構成をとる。同様に、AWSではFargateを用いてコンテナアプリケーションを実行し、RDSとVPC内接続を行うことができる。本記事では、GCPとAWSの各サービスを比較しながら、VPC接続の方法を詳しく解説する。

## GCPの場合
イメージだがこんな感じのアーキテクチャを想定している．
![スクリーンショット 2025-02-10 23.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/ff54de76-c07c-cb6c-99e3-70f3c82a29be.png)

## AWSの場合
イメージだがこんな感じのアークテクチャを想定している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/fc5915c5-3e0f-3307-b53e-1c718147423c.png)

> GCP CloudRunと AWS Fargateは以下で説明する通り，同じようなサービスではないが本記事ではVPC内外の接続にフォーカスして説明する記事なので今回は違いがあっても気にしないことにします

# 構成概要
GCPやAWSで上記で示したアーキテクチャを構築するための各種サービスを紹介する．
## GCPの構成
- **コンピュート:** Cloud Run（VPC内接続）
![スクリーンショット 2025-02-10 16.19.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/30df723a-2996-8d24-926e-dc6bfd2584b1.png)

- **RDBMS:** Cloud SQL（MySQL, PostgreSQL, SQL Server）
![スクリーンショット 2025-02-10 16.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/c2eb7b2b-e065-5c32-cb75-eceff8579998.png)

- **ネットワーク:** VPC、Private IPによる接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/01109335-99be-8eb1-be35-f4539444f193.png)

## AWSの構成
- **コンピュート:** AWS Fargate（VPC内接続）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/b439fa3f-8bed-16ba-d16a-5fd2e2ef3270.png)

- **RDBMS:** Amazon RDS（MySQL）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/8ccb0398-6674-27d0-9ad6-20722b7a5214.png)

- **ネットワーク:** VPC、PrivateLinkを活用した接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/6bf84b94-0903-74ad-bf50-54177c62c0f4.png)


# 各サービスの紹介
GCPとAWSそれぞれのサービスの比較を行う

## Cloud Run（GCP） vs AWS Fargate（AWS）
- **Cloud Run:** フルマネージドなコンテナ実行環境で、スケーラビリティとコスト効率に優れる。VPC Connectorを利用することで、VPC内のリソース（Cloud SQLなど）とプライベート接続が可能。

:::note info
**GCP VPC Connectorとは**
Google Cloud RunやCloud Functionsなどのサーバーレス環境から，VPC（Virtual Private Cloud）内のリソースにプライベートネットワーク経由でアクセスするためのマネージドサービスである．これにより，Cloud SQLやGCE，GKEなどのVPC内のリソースに対して，パブリックIPを経由せずに通信できる．

**VPC Connectorの仕組み**

VPC Connectorは，Googleが管理する専用のGCEインスタンス群（自動スケーリングするVM）で構成され，以下の流れで動作する．

1. サーバーレス環境（Cloud Run, Cloud Functions, App Engine）からVPC Connectorを介してリクエストを送信する．
2. VPC Connectorのインスタンスがリクエストを処理し，VPC内のリソースへ転送する．
3. VPC内のリソース（Cloud SQL, GCEなど）がレスポンスを返し，VPC Connector経由でサーバーレス環境へ戻る．
:::
- **AWS Fargate:** フルマネージドなコンテナ実行環境で、ECSまたはEKSと統合される．

:::note info
**AWSのECSやEKSとは**
AWSにはコンテナワークロードを管理するためのマネージドサービスとして **ECS（Elastic Container Service）** と **EKS（Elastic Kubernetes Service）** がある．どちらもコンテナのデプロイ・管理を行うが，基盤となるオーケストレーション技術が異なる．

**ECS（Elastic Container Service）**

AWSが提供するコンテナオーケストレーションサービスであり，AWS独自のコンテナ管理システムである．Kubernetesのようなサードパーティのツールを使用せずに，シンプルにAWS内でコンテナを実行・管理できる．

**ECSの特徴**

- **AWSのネイティブサービス**：Kubernetesのような追加の設定が不要で，AWSの他のサービス（IAM, ALB, CloudWatchなど）とスムーズに統合できる．
- **Fargateのサポート**：EC2インスタンスを管理せずにコンテナを実行できる．
- **EC2との統合**：コンテナをEC2インスタンス上で実行するクラスタを構築することも可能．
- **簡単な運用**：EKSに比べて運用がシンプルで，AWS環境に最適化されている．

**ECSの実行モード**

ECSには以下の2つの実行モードがある．

1. **Fargateモード**（サーバーレス）
   - サーバー管理不要で，コンテナリソースのプロビジョニングが自動化される．
   - スケーラビリティに優れ，コンテナの台数を意識せずに運用可能．
   - コストは使用したCPUとメモリに基づいて課金される．

2. **EC2モード**（インスタンス管理）
   - EC2上にECSクラスタを作成し，コンテナを実行する．
   - 自分でEC2のインスタンスサイズやオートスケーリングを管理できる．
   - Fargateに比べて細かいチューニングが可能．

**ECSのアーキテクチャ**

ECSを利用する際の基本的な構成は以下のようになる．

1. **クラスター**：ECSが管理するコンテナの集合体．EC2またはFargate上で動作する．
2. **タスク定義**：コンテナの実行設定（Dockerイメージ, CPU, メモリ, ネットワークなど）を定義する．
3. **サービス**：タスクを複数実行し，ロードバランシングやスケーリングを管理する．
4. **タスク**：実際に実行されるコンテナインスタンス．

---

**EKS（Elastic Kubernetes Service）**

AWSが提供する**マネージドKubernetes（K8s）サービス**である．AWS上でKubernetesクラスターを簡単に構築・管理できる．

**EKSの特徴**

- **Kubernetesの標準APIを利用可能**：既存のKubernetesの設定やツールをそのまま利用できる．
- **EC2またはFargateで実行可能**：ECSと同様に，EC2インスタンスを管理するか，Fargateでサーバーレス運用ができる．
- **マネージドなKubernetesコントロールプレーン**：EKSではKubernetesのコントロールプレーンをAWSが管理し，運用の負担を軽減する．
- **マルチクラウド対応**：ECSに比べてKubernetesの標準機能をそのまま利用できるため，AWS以外の環境との互換性が高い．
- **カスタマイズ性が高い**：CNI（Container Network Interface）やIngress Controllerなど，Kubernetesのエコシステムを活用できる．

**EKSのアーキテクチャ**

EKSの基本的な構成は以下の通りである．

1. **EKSクラスター**：AWSが管理するKubernetesクラスター．
2. **ノードグループ**：コンテナを実行するEC2インスタンス群（またはFargate）．
3. **Pod**：Kubernetesの最小単位で，1つ以上のコンテナを実行する．
4. **Deployment/Service**：アプリケーションのスケール管理や負荷分散を担う．

:::

## Cloud SQL（GCP） vs Amazon RDS（AWS）
- **Cloud SQL:** フルマネージドなRDBMSサービスで、MySQL、PostgreSQL、SQL Serverをサポートする。Private IPを有効化することで、Cloud RunなどのVPC内リソースと安全に接続可能。
- **Amazon RDS:** フルマネージドなRDBMSサービスで、Cloud SQLと同様にMySQL、PostgreSQL、SQL Serverをサポート。PrivateLinkまたはSecurity Groupを活用し、VPC内接続が可能。

## VPCとPrivate IP接続
- **GCP:** VPC Connectorを利用してCloud RunとCloud SQLの通信をインターネット経由せずに行う。
- **AWS:** PrivateLinkを利用してFargateとRDSの通信をインターネット経由せずに行う。

# Cloud RunとCloud SQLの接続方法（GCP）

## 1. VPCの作成
VPCを作成し、Cloud SQLを配置するサブネットを定義する。

## 2. Cloud SQLのPrivate IP有効化
Cloud SQLを作成する際、 **「Private IP」** を有効にし、特定のVPCと関連付ける。

## 3. Serverless VPC Access Connectorの作成
Cloud RunからVPC内のCloud SQLに接続するため、**Serverless VPC Access Connector**を作成する。

## 4. Cloud SQLへの接続設定
Cloud Runの環境変数にCloud SQLのPrivate IPアドレスを設定し、アプリケーション側で適切に接続を行う。

# AWS FargateとRDSの接続方法（AWS）

## 1. VPCの作成
VPCを作成し、RDSを配置するサブネットを定義する。

## 2. Amazon RDSのPrivateLink有効化
RDSを作成する際、 **「PrivateLink」**を有効にし、特定のVPCと関連付ける。

## 3. AWS Fargateのタスク定義
ECSクラスターを作成し、Fargateのタスク定義を作成する。

## 4. Fargateのデプロイ
Fargateタスクをデプロイする際にRDSと接続する設定を行う。

## 5. RDSへの接続設定
Fargateの環境変数にRDSのPrivate IPアドレスを設定し、アプリケーション側で適切に接続を行う。

# コストの比較

| 比較項目 | Cloud Run + Cloud SQL (GCP) | AWS Fargate + RDS (AWS) |
|----------|----------------------|----------------------|
| **コンピュート料金** | リクエスト単位課金 | vCPU/メモリ単位課金 |
| **RDBMS料金** | インスタンスの大きさやストレージ単位 | インスタンスの大きさやストレージ単位 |
| **ネットワーク料金** | VPC内通信は無料（一定条件内） | PrivateLinkの使用に応じた課金 |

# VPC内のコンピュートに対して外部から接続できるようにする
VPC内のコンピュートに外部から接続できるようにするためには、GCPとAWSそれぞれで次の方法を考慮する必要がある．

## GCPの場合
### Cloud Runに接続
Cloud Runをデプロイする際に、外部から接続するには、Cloud RunにCloud DNSのゾーンをマッピングしてカスタムドメインを設定するか、Cloud Load Balancing(これも同じくCloud DNSのゾーンをマッピングする)を経由する必要がある．

**手順**
Cloud Load Balancingを作成し、バックエンドサービスとしてCloud Runを指定する．
URLマップを作成し、ドメインにリクエストが来るように設定する．
Cloud Runサービスにアクセスするために、IAMポリシーで適切なアクセス権限を設定する．

### Cloud SQL（VPC内接続）に接続
VPC内のCloud SQLインスタンスはServerless VPC Access ConnectorでPrivate IPを使ってアクセスするが、外部(GCP Project)からアクセスする場合は、Cloud SQL Proxyを使うか、IP公開設定を有効にする必要がある．

**手順**
Cloud SQLのPrivate IP接続を使用し、VPC内のリソースから接続する．VPCサービス外からのアクセスはServerless VPC Access Connectorを用いてアクセスする．
外部からの接続が必要な場合は、Cloud SQL Proxyを使うか、Public IPを有効にしてアクセスする．

## AWSの場合
### Fargate（VPC内接続）に接続
Fargateでデプロイしたコンテナは、VPC内でセキュアに接続され、外部からのアクセスはNLB（Network Load Balancer）やALB（Application Load Balancer）を経由して行う．

**手順**
ALBまたはNLBを作成し、Fargateタスクにトラフィックをルーティングする．
セキュリティグループやIAMポリシーを設定して、外部からの適切な接続を許可する．

### RDS（VPC内接続）に接続
RDSに接続する場合、通常はVPC内接続が推奨されますが、外部から接続したい場合は、Publicly Accessible設定を有効にするか、PrivateLinkを利用して外部接続を行う．

**手順**
RDSインスタンスのPublicly Accessible設定を有効にすることで、インターネットからの接続が可能になる．
セキュリティグループを設定して、接続を許可するIPやポートを指定する．

## 使用事例

### SaaSアプリケーション
- **GCP:** Cloud Runの自動スケールを活かし、負荷変動の大きいSaaSアプリを構築。
- **AWS:** Fargateの自動スケール機能を活用し、高可用性のSaaSアプリを構築。

### REST APIバックエンド
- **GCP:** Cloud RunでAPIを実行し、Cloud SQLでデータを管理。VPC内接続でセキュアに運用。
- **AWS:** FargateでAPIをホストし、RDSでデータ管理。VPC内接続でセキュアに運用。

### データ分析基盤
- **GCP:** Cloud Runでデータ処理を行い、Cloud SQLに格納。BigQueryと組み合わせた分析基盤にも活用。
- **AWS:** Fargateでデータ処理を行い、RDSに格納。AthenaやRedshiftと統合した分析基盤を構築。

## まとめ
Cloud RunとCloud SQLをVPC内で接続するGCPのアーキテクチャと、FargateとRDSをVPC内で接続するAWSのアーキテクチャを比較した。それぞれの特性を理解し、用途に応じた選択を行うことが重要である。