Aurora DSQLのVPCエンドポイント名を取得するカスタムリソースをCDKで作成する
はじめに
Amazon Aurora DSQL(以下、DSQL)はPrivateLinkに対応しており、アプリケーションからDSQLにプライベート接続が可能です。PrivateLinkのエンドポイントを作成する際には、クラスター固有のサービス名を取得する必要があります。本記事では、CDKのカスタムリソースを使用してサービス名を取得する方法を紹介します。
DSQLのエンドポイントサービス名
DSQLクラスターを作成すると、クラスターのページに以下のようにエンドポイントサービス名が表示されます。
しかしながら、CDKでリソースを作成する場合、デプロイする前にエンドポイントサービス名を知りたいケースがあります。
エンドポイントサービス名を取得するには、GetVpcEndpointServiceName
というAPIを使用します。このAPIを実行すると以下のようなレスポンスが返却されます。
HTTP/1.1 200
Content-type: application/json
{
"serviceName": "string"
}
公式ドキュメントはこちらです。
GetVpcEndpointServiceName - Amazon Aurora DSQL
カスタムリソースの作成
DSQLクラスターとそのサービス名を取得するカスタムリソースの例です。
import * as cdk from 'aws-cdk-lib';
import * as dsql from "aws-cdk-lib/aws-dsql";
import { AwsCustomResource, AwsCustomResourcePolicy, PhysicalResourceId } from 'aws-cdk-lib/custom-resources';
import { Construct } from 'constructs';
export class DsqlEndpointCustomresourceStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// DSQLクラスターの作成
const dsqlCluster = new dsql.CfnCluster(this, "DsqlCluster");
// 作成したDSQLクラスターのエンドポイントサービス名を取得するためのカスタムリソース
const getServiceName = new AwsCustomResource(this, 'GetServiceName', {
onCreate: {
service: 'DSQL',
action: 'getVpcEndpointServiceName',
parameters: {
identifier: dsqlCluster.ref,
},
physicalResourceId: PhysicalResourceId.of(`dsql-service-name-${dsqlCluster.ref}`),
},
onUpdate: {
service: 'DSQL',
action: 'getVpcEndpointServiceName',
parameters: {
identifier: dsqlCluster.ref,
},
physicalResourceId: PhysicalResourceId.of(`dsql-service-name-${dsqlCluster.ref}`),
},
policy: AwsCustomResourcePolicy.fromSdkCalls({
resources: [dsqlCluster.attrResourceArn],
}),
});
// カスタムリソースがDSQLクラスターの作成を待つようにする
getServiceName.node.addDependency(dsqlCluster);
// APIのレスポンスからserviceNameプロパティの値を取得
const serviceName = getServiceName.getResponseField('serviceName');
// サービス名を出力
new cdk.CfnOutput(this, "DsqlEndpointServiceName", {
value: serviceName,
});
}
}
カスタムリソースの作成にはAwsCustomResource
というクラスを使用します。このクラスを使用すると、AWSのAPI呼び出しを実行するためのカスタムリソースを、Lambda関数を書くことなく作成できます。アクションとして、エンドポイントサービス名を取得するためのAPIgetVpcEndpointServiceName
を指定しています。
class AwsCustomResource (construct) · AWS CDK
[AWS CDK] APIを呼び出すだけのカスタムリソースならLambda関数は不要な件 | DevelopersIO
公式ドキュメントに記載がある通り、パラメータとしてidentifier
を設定する必要があります。identifier
は作成したクラスターのref
プロパティから取得します。
確認
CDKをデプロイ後、CloudFormationのスタックのページを開きます。「出力」タブにDSQLクラスターのエンドポイントサービス名が出力されています。
おわりに
DSQLクラスターのエンドポイントサービス名を取得するカスタムリソースを作成しました。AwsCustomResource
クラスを使うことでLambda関数を作成することなく、簡単に取得できました。
この記事がどなたかの参考になれば幸いです。