1. はじめに
Serverless Frameworkで構築されるAPI Gatewayのリソースに対してserverless.yml内で容易に設定の変更が出来ない.
2. 詳細
やりたいこととしては,Serverless FrameworkでAPI Gatewayのリソースを作成し,そのリソースを参照して,設定(例えばメソッドスロットリングやステージ変数など)を変更したい.
Serverless Frameworkがデフォルトでサポートしていない設定については,serverless.ymlのresources
のセクションに記述することで,AWS CloudFormationでstackに設定を追加できる.
resources
とは,Serverless Frameworkのサイトから引用すると下記の部分になる.
service: service-name
provider: aws
functions:
...
resources:
Resources:
ProxyResource:
Type: AWS::ApiGateway::Resource
Properties:
ParentId:
Fn::GetAtt:
- ApiGatewayRestApi # our default Rest API logical ID
- RootResourceId
PathPart: serverless # the endpoint in your API that is set as proxy
RestApiId:
Ref: ApiGatewayRestApi
ProxyMethod:
Type: AWS::ApiGateway::Method
Properties:
ResourceId:
Ref: ProxyResource
RestApiId:
Ref: ApiGatewayRestApi
HttpMethod: GET # the method of your proxy. Is it GET or POST or ... ?
MethodResponses:
- StatusCode: 200
Integration:
IntegrationHttpMethod: POST
Type: HTTP
Uri: http://serverless.com # the URL you want to set a proxy to
IntegrationResponses:
- StatusCode: 200
設定の変更には,Serverless Frameworkで作成されたリソースの論理IDが必要となる.論理IDはServerless Frameworkの命名規則に則って自動的に作成される.Serverless Frameworkの命名規則を見てもらうとわかるが,自動生成される論理IDが予測できるものと,そうでないものがある.予測が出来ないものとは作成される論理IDのルールに{randomNumber}が入っているもので,ここには名前の通りランダムな値が入る.API Gatewayのリソースは論理IDの命名規則が,ApiGatewayDeployment{randomNumber}
となっており,論理IDの予測が出来ない.
下記のように問題だと思っている人達がいる.
- Resource name "ApiGatewayDeployment{randomNumber}" should be "ApiGatewayDeployment" #4379
- Not possible to create resources that depend on the ApiGateway::Deployment #2233
2.1. 回避策
実施はしていないが下記のような回避先がある模様
Serverless Framework v1.0.0-rc.1でdeployコマンドをフックするプラグインを作る
3. 参考リンク
- Resource name "ApiGatewayDeployment{randomNumber}" should be "ApiGatewayDeployment" #4379
- Serverless Framework - AWS Lambda Guide - AWS Infrastructure Resources
- API Gateway
- Not possible to create resources that depend on the ApiGateway::Deployment #2233
- Serverless Framework v1.0.0-rc.1でdeployコマンドをフックするプラグインを作る