はじめに
Cloud FunctionsからプライベートIPアドレスを持つCloud SQLへのアクセス方法を記載しています。
手順
- VPCネットワークの作成
- ファイアウォールルールの作成
- Cloud SQLの作成
- Serverless VPC Access コネクタの作成
- Cloud Functions サービス アカウントに適切な権限を付与
- コネクタを使用するように関数を構成(デプロイ)
手順1〜3について
以下の記事にまとめております。
[GCP]プライベートIPアドレスを持つCloud SQL(MySQL)作成方法と、VPCネットワーク割り当て方法
https://qiita.com/hanzawak/items/84ad707ca9596eb98bcc
手順4〜6について
本記事にまとめています。
なお以下のサイトを参考に作成しております。
https://cloud.google.com/functions/docs/connecting-vpc?hl=ja
手順
Serverless VPC Access コネクタの作成
Serverless VPC Access API を有効化
gcloud services enable vpcaccess.googleapis.com
コネクタを作成
gcloud beta compute networks vpc-access connectors create CONNECTOR_NAME \
--network VPC_NETWORK \
--region REGION \
--range IP_RANGE
入力値 | 内容 |
---|---|
CONNECTOR_NAME | コネクタの名前。なんでも良いです |
VPC_NETWORK | 作成済みのVPCネットワーク名 |
REGION | Cloud FunctionsとCloud SQLが配置されているリージョン |
IP_RANGE | 未使用の CIDR /28 IP 範囲。VPC ネットワーク内の既存の IP アドレス予約と重複してはならないたとえば10.1.0.0/28 といったように指定する |
Cloud Functionsの配置先リージョンの指定は、デプロイ時に--region asia-northeast1
のようにフラグを追加するだけです。
コネクタの状態を確認
gcloud beta compute networks vpc-access connectors describe CONNECTOR_NAME --region REGION
出力にstate: READY
が含まれていたらOKです。
Cloud Functions サービス アカウントに適切な権限を付与
プロジェクト番号の確認
gcloud projects describe PROJECT_ID --format="value(projectNumber)"
Cloud Functions サービス エージェントにviewerの役割を付与
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:service-PROJECT_NUM@gcf-admin-robot.iam.gserviceaccount.com \
--role=roles/viewer
Cloud Functions サービス エージェントに compute.networkUser の役割を付与
gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:service-PROJECT_NUM@gcf-admin-robot.iam.gserviceaccount.com \
--role=roles/compute.networkUser
コネクタを使用するように関数を構成(デプロイ)
関数をデプロイ
gcloud beta functions deploy FUNCTION_NAME \
--vpc-connector projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME \
FLAGS...
FLAGS... は、関数のデプロイ時に渡す他のフラグです。
これでCloud FunctionsからCloud SQLへ通信できるはずです。
備考
Stackdriverのログで以下のようなものが出力されている場合は、Cloud FunctionsとCloud SQLの通信が取れていないものと思われます。
本記事の内容を実施しても以下のログが出力される場合は、以下を確認してください。
- Cloud FunctionsとCloud SQLのリージョンが同じであるか
- Cloud FunctionsとCloud SQLはVPCネットワークに追加しているか
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)")
Aborted connection 79914 to db: 'unconnected' user: 'root' host: 'localhost' (Got an error reading communication packets)"