[アップデート] AWS SAM でプライベート REST API のカスタムドメインが設定できるようになりました
いわさです。
もう半年近く前になりますが、API Gateway のプライベート REST API がカスタムドメインをサポートしました。
遂に来たか・・・というアップデートだったわけですが、この API Gateway というやつは CloudFormation で管理しようとする様々なコンポーネントを組み合わせる必要がありちょっと面倒です。
一方で、AWS SAM を使うと、シンプルなサーバーレスコンポーネントAWS::Serverless::Api ひとつで API Gateway をデプロイすることが出来たりします。
ただし、冒頭のプライベート REST API のカスタムドメインについてはサポートされておらず、CloudFormation のAWS::ApiGateway::DomainNameV2やAWS::ApiGateway::BasePathMappingV2などと組み合わせて頑張る必要がありました。
これが先日のアップデートである程度 SAM がうまいことやってくれるようになりました。
具体的にはAWS::Serverless::ApiのプロパティのみでAWS::ApiGateway::DomainNameV2やAWS::ApiGateway::BasePathMappingV2が自動生成されるようになるので、シンプルに実装できます。
テンプレート
作ったテンプレートがこちらです。
ポイントとしては、AWS::Serverless::ApiのDomainプロパティにカスタムドメインの情報を設定していきます。
Domain.EndpointConfigurationがPRIVATEに設定されるとDomain.DomainNameやDomain.CertificateArn、Domain.BasePathを使ってAWS::ApiGateway::DomainNameV2やAWS::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 リソースが作成されていることが確認できました。

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

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

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

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

さいごに
本日は AWS SAM でプライベート REST API のカスタムドメインが設定できるようになったので試してみました。
実はテンプレート作成するまでにだいぶ苦戦したのですが、どうにか作成出来ました。
関連付けの方法がわからなかったので実際に使うかは不明ですが、一応できるようになったということだけ覚えておきたいと思います。









