LoginSignup
0
0

APIGatewayをCDKで構築するコツ

Last updated at Posted at 2023-04-18

ターゲット

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設定部分は省略していますので、定義方法は他の記事を参照してください。

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0