3
votes

I am using the AWS CLI to deploy a SAM template.

The AWS Api Name is being set to the same as the CloudFormation Stack Name. I expected the Api to be called "Users" based on this template content below.

Is it possible to set the API name?

SAM template:

  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      Name: Users
      StageName: default

Update with additional information (complete template and AWS CLI commands used to deploy):

Template:

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 commands:

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
1
It's not possible based on this code fragment. It would create an API called Users as you expect. You must have a reference to the StackName in your template somewhere. Can you provide more of it?Alex Harvey
@pyb, those tags you removed actually were correct. This is a question about AWS SAM, because it refers to one of the SAM resource types.Alex Harvey
Also @jhurtas, why do you say you are using CloudFormation rather than SAM? I assume you are aware that you provided a SAM template?Alex Harvey
Sorry @AlexHarvey, my bad.pyb
I updated question to clarify I am using sam template.jhurtas

1 Answers

4
votes

Your use of the Name property is the correct way to set the API Name.

However, I think you are confused about what this template is doing. As you have written it, this template creates two APIs - the "implicit API", and then the API named "Users" that you declared explicitly.

Note that:

  • The implicit API takes its name from the Stack Name. (Which seems to be what you are observing.)

  • The explicit API takes its name from the Name property.

If you don't want to create the implicit API but rather define it explicitly yourself - which appears to be the case - then you just need to refer to it:

  Events:
    GetEvent:
      Type: Api
      Properties:
        Path: /
        Method: post
        RestApiId: !Ref MyApi # Add this line

That will result in a single API being created and it will have the name "Users".