[アップデート] 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 のカスタムドメインが設定できるようになったので試してみました。
実はテンプレート作成するまでにだいぶ苦戦したのですが、どうにか作成出来ました。
関連付けの方法がわからなかったので実際に使うかは不明ですが、一応できるようになったということだけ覚えておきたいと思います。