ターゲット
CDKでAPIGatewayを構築したい。
APIGatewayをOPENAPIで定義をしたい。
OPENAPIでAPIGatewayを構築するメリット
最大のメリットはドキュメントの作成とAPIの実装を同時にできることだと思います。
簡単に書けるのに、OPENAPI形式で構成を記述すれば、可読性も上がるし、APIGatewayに読み込ませるだけですぐにAPIが実装できます。
しかし、CDKでAPIGatewayを構築すると、AWSの拡張機能もOPENAPIに記述しなくてはならないです。
以下のようなオブジェクトです。毎回調べる必要があるのは手間です。
x-amazon-apigateway-integration
open-apix
解決策になるのが以下のライブラリです。
npm i openapix
で使えます。
使い方の詳細はAPIリファレンスを参照してください。
使い方のコツ
使い方の流れは以下のようになります。
- OPENAPIを記述
- CDKの定義ファイル内でopenapixのモジュールを呼び出す
- openapixのモジュールでOPENAPIを読み込む
- OPENPAIで定義できないAPIGatewayの設定を記載する
実際にAPIGateway→Lambdaで構築したAPIのCDKを解説します。
サンプルコード
api_gateway_stack.ts
import * as cdk from 'aws-cdk-lib';
import * as iam from 'aws-cdk-lib/aws-iam';
import * as iambda from 'aws-cdk-lib/aws-lambda';
import * as apigw from 'aws-cdk-lib/aws-apigateway';
import * as openapix from '@alma-cdk/openapix';
import * as path from 'path'
import { Construct } from 'constructs';
export class ApiStack extends
cdk.Stack { constructor (scope: Construct, id: string, props?: cdk.StackProps)
{
super(scope, id, props);
const apiResourcePolicy = new iam.PolicyDocument({
statements: [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
principals: [new iam.AnyPrincipal(),
actions: ['execute-api: Invoke'],
resources: ['execute-api:/*/*/*'],
conditions: {
'IpAddress': {
"aws: SourceIp": [
"xxx.xxx.xxx.xxx/32",
"xxx.xxx.xxx.xxx/32"
]
}
})
]
})
const api = new openapix.Api(this,'api', {
source: path.join (dirname, '../openapi/openapi.yaml'),
restApiProps: {
policy: apiResourcePolicy
},
paths: {
/api/{path}': {
get: new openapix.LambdaIntegration(this, lambdaFunction)
}
}
}
}
サンプルコードの解説
-
apiResourcePolicy
: APIGatewayのリソースポリシーを定義しています。ここではIPアドレスを制限しています。 -
openapix.Api
: openapixを使ってAPIGatewayの設定を定義します。 -
source
: openapiディレクトリに配置しているOPENAPI形式のyamlファイルを読み込んでいます。 -
restApiProps
: リソースポリシーを設定しています。リソースポリシー以外にもRESTAPIの設定を加えることができます。 -
paths
: APIのパスを設定しています。 -
openapix.LambdaIntegration
: 事前に定義したLambda関数を呼び出しています。今回のサンプルコードではLambda設定部分は省略していますので、定義方法は他の記事を参照してください。
参考記事