[アップデート] AWS SAM でプライベート REST API のカスタムドメインが設定できるようになりました

[アップデート] AWS SAM でプライベート REST API のカスタムドメインが設定できるようになりました

Clock Icon2025.04.10

いわさです。

もう半年近く前になりますが、API Gateway のプライベート REST API がカスタムドメインをサポートしました。

https://dev.classmethod.jp/articles/api-gateway-custom-domain-name-private-rest/

遂に来たか・・・というアップデートだったわけですが、この API Gateway というやつは CloudFormation で管理しようとする様々なコンポーネントを組み合わせる必要がありちょっと面倒です。
一方で、AWS SAM を使うと、シンプルなサーバーレスコンポーネントAWS::Serverless::Api ひとつで API Gateway をデプロイすることが出来たりします。

ただし、冒頭のプライベート REST API のカスタムドメインについてはサポートされておらず、CloudFormation のAWS::ApiGateway::DomainNameV2AWS::ApiGateway::BasePathMappingV2などと組み合わせて頑張る必要がありました。

これが先日のアップデートである程度 SAM がうまいことやってくれるようになりました。
具体的にはAWS::Serverless::ApiのプロパティのみでAWS::ApiGateway::DomainNameV2AWS::ApiGateway::BasePathMappingV2が自動生成されるようになるので、シンプルに実装できます。

https://aws.amazon.com/about-aws/whats-new/2025/04/aws-sam-api-gateway-custom-domain-names/

テンプレート

作ったテンプレートがこちらです。
ポイントとしては、AWS::Serverless::ApiDomainプロパティにカスタムドメインの情報を設定していきます。
Domain.EndpointConfigurationPRIVATEに設定されるとDomain.DomainNameDomain.CertificateArnDomain.BasePathを使ってAWS::ApiGateway::DomainNameV2AWS::ApiGateway::BasePathMappingV2が自動作成されるという仕組みです。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: ---

Parameters:
  DomainName:
    Type: String
    Default: hoge0410sam.tak1wa.com
  CertificateArn:
    Type: String
    Default: arn:aws:acm:us-east-1:123456789012:certificate/c0b66934-b0fd-4f9f-ac84-52de803ecfd9
  VpcEndpointId: 
    Type: String
    Default: vpce-0e170865e396976ac
  HosterZoneId:
    Type: String
    Default: Z0992926385LE7YEPP9PZ

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs20.x
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            RestApiId: !Ref PrivateApi
            Path: /hello
            Method: get
  PrivateApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Auth:
        ResourcePolicy:
          CustomStatements: 
            - Effect: 'Allow'
              Action: 'execute-api:Invoke'
              Resource: ['execute-api:/*/*/*']
              Principal: '*'
      EndpointConfiguration:
        Type: PRIVATE
        VpcEndpointIds:
          - !Ref VpcEndpointId
      Domain:
        BasePath: v1
        SecurityPolicy: TLS_1_2
        EndpointConfiguration: PRIVATE
        DomainName: !Ref DomainName
        CertificateArn: !Ref CertificateArn
        Policy:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Principal: '*'
              Action: 'execute-api:Invoke'
              Resource: 'execute-api:/*/*/*'
              Condition:
                StringEquals:
                  aws:SourceVpce: !Ref VpcEndpointId

上記テンプレートで作成したスタックの作成リソースを見てみると、プライベート REST API 用のカスタムドメインやマッピングの V2 リソースが作成されていることが確認できました。

6D8BA79A-B7CD-4FEB-83F7-239306920C3E_1_105_c.jpeg

コンソールも見てみると次のように新しいカスタムドメインが作成されています。

26BAB6C8-E86E-4E89-A351-CB67728FFDC2_1_105_c.jpeg

また、API マッピングも設定されていますね。

84786BC0-84F7-4284-AF2E-E7FE1723606F_1_105_c.jpeg

ただし、私が確認した限りではドメイン名アクセスの関連付けまではされないようでした。ドキュメント上もどのプロパティでどう結びつくのか記載されておらず、ここは対応されていないのではないかと思っています。

A04B51C9-845D-4745-B36A-7AD200B34620_1_105_c.jpeg

ドメイン名 ARN と VPC エンドポイント ID がわかればAWS::ApiGateway::DomainNameAccessAssociationで関連付けしてやることができるのですが、AWS::Serverless::Apiから Ref 参照が出来ないんですよね。今回は手動で関連付けしました。

ED3B503E-A8F6-4302-9466-22F59CB3F17D.png

さいごに

本日は AWS SAM でプライベート REST API のカスタムドメインが設定できるようになったので試してみました。

実はテンプレート作成するまでにだいぶ苦戦したのですが、どうにか作成出来ました。
関連付けの方法がわからなかったので実際に使うかは不明ですが、一応できるようになったということだけ覚えておきたいと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.