はじめに
Google CloudのCloud SQLに保存されているデータをCloud Functions(PHP)を使用して、CSV形式でCloud Storageへ格納する方法をまとめました。ソースは要点のみ記載しているため、そのままだと動かないので適宜修正が必要です。
使用サービス
- Cloud SQL
- Cloud Functions
- Cloud Storage
やろうとしていること
- Cloud SQL → サーバレスエクスポートでCSV出力 → Cloud Storage格納
権限
- cloudsql.instances.export
- storage.objects.create
- storage.objects.get
ソース
use Google\Cloud\Sql\V1beta4\ExportContext;
use Google\Cloud\Sql\V1beta4\ExportContext\SqlCsvExportOptions;
use Google\Cloud\Sql\V1beta4\ExportContext\SqlExportOptions;
use Google\Cloud\Sql\V1beta4\InstancesExportRequest;
use Google\Cloud\Sql\V1beta4\SqlFileType;
use Google\Cloud\Sql\V1beta4\SqlInstancesServiceClient;
use Google\Cloud\Storage\StorageClient;
use Google\CloudFunctions\CloudEvent;
function function(CloudEvent $cloudevent)
{
// サーバレス転送のクライアントクラス
$sqlInstancesServiceClient = new SqlInstancesServiceClient();
// csv出力のオプション設定
$csvExportOptions = new SqlCsvExportOptions();
// クエリの設定
$selectQuery = 'SELECT `column1` FROM tbl_test WHERE value = 1';
$csvExportOptions->setSelectQuery($selectQuery);
// デフォルト値を設定
$csvExportOptions->setEscapeCharacter("5C");
$csvExportOptions->setQuoteCharacter("22");
$csvExportOptions->setFieldsTerminatedBy("2C");
$csvExportOptions->setLinesTerminatedBy("0A");
// 出力先のCloudStorageの設定
$data = [
'uri' => "gs://test_bucket/test.csv", //出力ファイル
'databases' => [
'test-db', //Cloud SQLのDB名
],
'kind' => "sql#exportContext",
'csv_export_options' => $csvExportOptions,
'file_type' => SqlFileType::CSV,
'offload' => true // サーバーレスエクスポート
];
$exportContext = new ExportContext($data);
// リクエスト生成
$instancesExportRequest = new InstancesExportRequest();
$instancesExportRequest->setExportContext($exportContext);
$optionalArgs = [
'project' => 'test_project', // project名
'instance' => 'test_instance', // CloudSQLのinstance名
'body' => $instancesExportRequest,
];
// エクスポート処理
// try/catcheやエラー処理も実装する
$response = $sqlInstancesServiceClient->export($optionalArgs);
}
今回Cloud Functionsの実行は、Cloud Schedulerで起動しています。Cloud SchadulerのイベントBodyに変数入れておくと色々な転送が作れますので、クエリ内容や出力先のバケット名なども設定できるようにしておけば、ソースは変更せずに汎用的に使用できます。
サーバレスエクスポートは、例えば本番用に稼働しているDBインスタンスとは別に、一時的にインスタンスを生成してエクスポートを行ってくれるため、本番用のDBへの影響を回避することができます。
データが多くなるテーブルや負荷のかかるクエリでの抽出などを行うときは便利な機能です。出力には少し時間がかかるので、実行頻度は抑えたほうが良いです。
また、カラムがNULLの場合、csvExportOptionsでデフォルト値が何も設定していない状態だと「”N」で出力されます。この状態だとCSVファイルが壊れてしまうため、デフォルト値を設定することで「\N」が出力されるようにしています。
こちらの記事に記載しましたがBigQueryへの転送時にNULL設定を行う際に必要となります。
そしてCloud Storageの出力先のバケットへのアクセス権限も忘れずに確認が必要です。(permissionエラーで出力ができなくなります。)
その他
続いての処理として、Cloud Storage内に配置したCSVファイルのデータをBigQueryへ転送したので、方法については別記事に記載しました。
・Cloud Functions(PHP)を使用して、CSVファイルのデータをBigQueryへ転送する