Search code examples
apiaws-lambdaaws-cloudformationserverlessgateway

Create CloudFormation stack from AWS Lambda function, passing API Gateway parameters


I am unable to get parameters in Lambda function. If I mention parameters value in lambda it works fine. when I remove parameters values from Lambda function and try from API gateway or test lambda it process default parameters values. please help My Lambda function is :

import boto3
import time
import json

datetime = time.strftime("%Y%m%d%H%M%S")
stackname = 'myec2'
client = boto3.client('cloudformation')
response = client.create_stack(
  StackName= (stackname+ '-' + datetime),
  TemplateURL='https://testnaeem.s3.amazonaws.com/ec2tags.yaml',
  Parameters=[
  {
    "ParameterKey": "MyInstanceName",
    "ParameterValue": " "
  },
  {
    "ParameterKey": "MyInstanceType",
    "ParameterValue": " "
  }
]
)


def lambda_handler(event, context):
            return(response)

My CloudFormation template is:

---
Parameters:
  MyInstanceType:
    Description: Instance type description
    Type: String
  MyInstanceName:
    Description: Instance type description
    Type: String  

Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: us-east-1a
      ImageId:  ami-047a51fa27710816e
      InstanceType: !Ref MyInstanceType
      KeyName: miankeyp
      Tags:
        - Key : Name
          Value : !Ref MyInstanceName
        - Key : app 
          Value : demo

Please help what changes required in the Lambda function.

My test Values are:

{
  "MyInstanceName": "demott",
  "MyInstanceType": "t2.micro"
}

Solution

  • I modified the code of your lambda function. Please check comments in the code for clarification:

    import boto3
    import time
    import json
    
    datetime = time.strftime("%Y%m%d%H%M%S")
    stackname = 'myec2'
    client = boto3.client('cloudformation')
    
    def lambda_handler(event, context):
    
        print(event) # to check what your even actually is
        # it will be printed out in CloudWatch Logs for your
        # function
    
        # you have to check what the event actually looks like
        # and adjust event['MyInstanceName'] and event['MyInstanceType']
        # in the following code
    
        response = client.create_stack(
          StackName= (stackname+ '-' + datetime),
          TemplateURL='https://testnaeem.s3.amazonaws.com/ec2tags.yaml',
          Parameters=[
          {
            "ParameterKey": "MyInstanceName",
            "ParameterValue": event['MyInstanceName']
          },
          {
            "ParameterKey": "MyInstanceType",
            "ParameterValue": event['MyInstanceType']
          }
        ]
        )
    
        return(response)
    

    By the way, such function and API gateway can spin up a lot of ec2 instances very quickly. So that you are aware of this.