从 AWS Lambda 函数创建 CloudFormation 堆栈,传递 API 网关参数

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

我无法在 Lambda 函数中获取参数。如果我在 lambda 中提到参数值,它就可以正常工作。当我从 Lambda 函数中删除参数值并尝试从 API 网关或测试 lambda 时,它会处理默认参数值。请帮忙 我的 Lambda 函数是:

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)

我的 CloudFormation 模板是:

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

请帮助在 Lambda 函数中需要进行哪些更改。

我的测试值是:

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

我修改了你的lambda函数的代码。请检查代码中的注释以进行说明:

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)

顺便说一下,这样的功能和 API 网关可以非常快速地启动很多 ec2 实例。以便您了解这一点。