API 名称始终是 SAM 中的堆栈名称
API Name is always the Stack Name in SAM
我正在使用 AWS CLI 部署 SAM 模板。
AWS Api 名称设置为与 CloudFormation 堆栈名称相同。根据下面的模板内容,我希望 Api 被称为 "Users"。
是否可以设置API名称?
SAM 模板:
MyApi:
Type: AWS::Serverless::Api
Properties:
Name: Users
StageName: default
更新附加信息(完整的模板和用于部署的 AWS CLI 命令):
模板:
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Resources:
HelloFunction:
Type: AWS::Serverless::Function
Properties:
Handler: main
Runtime: go1.x
Events:
GetEvent:
Type: Api
Properties:
Path: /
Method: post
#RestApiId: !Ref ApiGateway1
LambdaInvokePermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !GetAtt
- HelloFunction
- Arn
Action: 'lambda:InvokeFunction'
Principal: apigateway.amazonaws.com
SourceAccount: !Ref 'AWS::AccountId'
MyApi:
Type: AWS::Serverless::Api
Properties:
Name: Users
StageName: default
EndpointConfiguration: REGIONAL
DefinitionBody:
swagger: "2.0"
info:
title: "TestAPI"
paths:
/:
post:
x-amazon-apigateway-integration:
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${HelloFunction.Arn}/invocations
responses: {}
httpMethod: "POST"
type: "aws_proxy"
Outputs:
FunctioArn:
Value: !GetAtt HelloFunction.Arn
Export:
Name: HelloFunctionArn
CLI 命令:
aws cloudformation package --template-file template.yml
--output-template-file samtemplate.yaml --s3-bucket (bucketname)
aws cloudformation deploy --template-file samtemplate.yaml
--stack-name apisample-stack --capabilities CAPABILITY_IAM
您使用的名称 属性 是设置 API 名称的正确方法。
但是,我认为您对这个模板的作用感到困惑。如您所写,此模板创建两个 API - "implicit API",然后是您显式声明的名为 "Users" 的 API。
注意:
隐含的 API 的名称取自 Stack Name。 (这似乎就是您所观察到的。)
显式 API 的名称取自名称 属性。
如果您不想创建隐式 API 而是自己明确定义它 - 似乎是这种情况 - 那么您只需要参考它:
Events:
GetEvent:
Type: Api
Properties:
Path: /
Method: post
RestApiId: !Ref MyApi # Add this line
这将导致创建单个 API,并将其命名为 "Users"。
我正在使用 AWS CLI 部署 SAM 模板。
AWS Api 名称设置为与 CloudFormation 堆栈名称相同。根据下面的模板内容,我希望 Api 被称为 "Users"。
是否可以设置API名称?
SAM 模板:
MyApi:
Type: AWS::Serverless::Api
Properties:
Name: Users
StageName: default
更新附加信息(完整的模板和用于部署的 AWS CLI 命令):
模板:
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Resources:
HelloFunction:
Type: AWS::Serverless::Function
Properties:
Handler: main
Runtime: go1.x
Events:
GetEvent:
Type: Api
Properties:
Path: /
Method: post
#RestApiId: !Ref ApiGateway1
LambdaInvokePermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !GetAtt
- HelloFunction
- Arn
Action: 'lambda:InvokeFunction'
Principal: apigateway.amazonaws.com
SourceAccount: !Ref 'AWS::AccountId'
MyApi:
Type: AWS::Serverless::Api
Properties:
Name: Users
StageName: default
EndpointConfiguration: REGIONAL
DefinitionBody:
swagger: "2.0"
info:
title: "TestAPI"
paths:
/:
post:
x-amazon-apigateway-integration:
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${HelloFunction.Arn}/invocations
responses: {}
httpMethod: "POST"
type: "aws_proxy"
Outputs:
FunctioArn:
Value: !GetAtt HelloFunction.Arn
Export:
Name: HelloFunctionArn
CLI 命令:
aws cloudformation package --template-file template.yml
--output-template-file samtemplate.yaml --s3-bucket (bucketname)
aws cloudformation deploy --template-file samtemplate.yaml
--stack-name apisample-stack --capabilities CAPABILITY_IAM
您使用的名称 属性 是设置 API 名称的正确方法。
但是,我认为您对这个模板的作用感到困惑。如您所写,此模板创建两个 API - "implicit API",然后是您显式声明的名为 "Users" 的 API。
注意:
隐含的 API 的名称取自 Stack Name。 (这似乎就是您所观察到的。)
显式 API 的名称取自名称 属性。
如果您不想创建隐式 API 而是自己明确定义它 - 似乎是这种情况 - 那么您只需要参考它:
Events:
GetEvent:
Type: Api
Properties:
Path: /
Method: post
RestApiId: !Ref MyApi # Add this line
这将导致创建单个 API,并将其命名为 "Users"。