こしあん
2024-12-08

API Gatewayのモック統合を試す


10{icon} {views}

AWSのAPI Gatewayの「モック統合」機能を初めて試してみました。Lambdaを用意せずに静的なレスポンスを返せるため、認証部分の検証やコストを抑えたAPIテストに便利……らしい。

はじめに

  • AWSのAPI Gatewayは結構使ってはいるものの「モック統合」という機能をDVAを勉強してて初めて知ったので試してみた
  • 通常API GatewayはLambdaなどを後ろに統合させるのだが、Lambdaのソースコードができていないときに「とりあえずの出力」を出しておくために便利な機能らしい(ダミーのLambdaおいておけばいいとは思うけど)
  • 静的な返答しかできないものの、コストがかからないとか、モックといいつつ認証の部分は試せるなど面白い機能があるので試してみた
    • 特に認証の部分をメインのロジックと切り離して検証できるのは嬉しい気がする

参考

Terraformのコード

マネジメントコンソールやっても面白くないのでTerraformのコードで。四則演算のPOSTのAPIを定義し、全てモックの出力をする例。

# 今回はモック統合を行うエンドポイントとして add, sub, prd, div を定義
locals {
  operation_funcs = {
    "add" = "add"
    "sub" = "sub"
    "prd" = "prd"
    "div" = "div"
  }
}

# API Gateway
resource "aws_api_gateway_rest_api" "example_api" {
  name        = "ArithmeticOperationsAPI_Mock"
  description = "Mock API for arithmetic operations"
}

# 各operation用のリソース作成
resource "aws_api_gateway_resource" "operation_resource" {
  for_each    = local.operation_funcs
  rest_api_id = aws_api_gateway_rest_api.example_api.id
  parent_id   = aws_api_gateway_rest_api.example_api.root_resource_id
  path_part   = each.key
}

# 各operationに対してPOSTメソッドを作成
resource "aws_api_gateway_method" "operation_method" {
  for_each    = local.operation_funcs
  rest_api_id = aws_api_gateway_rest_api.example_api.id
  resource_id = aws_api_gateway_resource.operation_resource[each.key].id
  http_method = "POST"
  authorization = "NONE"
}

# モック統合設定
resource "aws_api_gateway_integration" "operation_integration" {
  for_each    = local.operation_funcs

  rest_api_id = aws_api_gateway_rest_api.example_api.id
  resource_id = aws_api_gateway_resource.operation_resource[each.key].id
  http_method = aws_api_gateway_method.operation_method[each.key].http_method
  type        = "MOCK"

  # リクエストが来た時、ステータスコード200で処理することを示す
  request_templates = {
    "application/json" = <<EOF
{
  "statusCode": 200
}
EOF
  }
}

# メソッドレスポンスの設定 (200 OK)
resource "aws_api_gateway_method_response" "operation_method_response_200" {
  for_each    = local.operation_funcs

  rest_api_id = aws_api_gateway_rest_api.example_api.id
  resource_id = aws_api_gateway_resource.operation_resource[each.key].id
  http_method = aws_api_gateway_method.operation_method[each.key].http_method
  status_code = "200"

  response_models = {
    "application/json" = "Empty"
  }
}

# 統合レスポンス設定: モックレスポンスを返却
resource "aws_api_gateway_integration_response" "operation_integration_response_200" {
  for_each    = local.operation_funcs

  rest_api_id = aws_api_gateway_rest_api.example_api.id
  resource_id = aws_api_gateway_resource.operation_resource[each.key].id
  http_method = aws_api_gateway_method.operation_method[each.key].http_method
  status_code = aws_api_gateway_method_response.operation_method_response_200[each.key].status_code

  response_templates = {
    "application/json" = <<EOF
{
  "message": "Mock response for ${each.key}"
}
EOF
  }
}

# デプロイメントの作成
resource "aws_api_gateway_deployment" "example_deployment" {
  rest_api_id = aws_api_gateway_rest_api.example_api.id

  triggers = {
    redeployment_resource    = sha1(jsonencode(values(aws_api_gateway_resource.operation_resource)))
    redeployment_method      = sha1(jsonencode(values(aws_api_gateway_method.operation_method)))
    redeployment_integration = sha1(jsonencode(values(aws_api_gateway_integration.operation_integration)))
    redeployment_method_response = sha1(jsonencode(values(aws_api_gateway_method_response.operation_method_response_200)))
    redeployment_integration_response = sha1(jsonencode(values(aws_api_gateway_integration_response.operation_integration_response_200)))
  }

  lifecycle {
    create_before_destroy = true
  }
}

# ステージの作成
resource "aws_api_gateway_stage" "example" {
  deployment_id = aws_api_gateway_deployment.example_deployment.id
  rest_api_id   = aws_api_gateway_rest_api.example_api.id
  stage_name    = "dev"
}

# エンドポイントURLの出力
output "api_endpoint" {
  value = aws_api_gateway_stage.example.invoke_url
}

テスト

マネジメントコンソールからの場合

マネジメントコンソールから確認。ちなみにAPI Gatewayの「テスト」機能には以下のように書いてあるが、これはテストの機能であって、モック統合の機能ではないようだ(つまり、モック統合は認証認可は機能しているが、それとは別にマネジメントコンソールのテストの機能によって認証認可をスキップしている)

テスト呼び出しを実行すると、API Gateway は認可をスキップし、メソッドを直接呼び出します。

Postmanの場合

Postmanからもモック統合の出力を得られる。このケースでは認証は特につけてないので、ヘッダーを特段追加しなくてもレスポンスが返ってくる。

所感

何に使うんだこれ感はあるけど、ダミーのLambdaをおくよりシンプルになったり、認証なしの状態でおいておいてDDoS食らって請求がどうとかの話はないから、使い所によっては便利なのだろうか。認証の部分のデバッグとしては期待できるかもしれない



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です