使用Lambda将StackId写入S3

时间:2016-07-07 18:04:34

标签: python amazon-web-services amazon-s3 aws-lambda amazon-cloudformation

我正在使用AWS Lambda(使用嵌套堆栈)使用create_stack api ..但我想将每个堆栈Id存储在S3中,这是作为嵌套堆栈的一部分创建的。 我使用python进行Lambda函数。

每当创建单个堆栈作为嵌套堆栈(cloudformation)的一部分时,它会为每个堆栈附加唯一的ID,如下所示

MYnestedStack-Ec2Stack-1WQDHSJFIFNFN

我想将此值存储在S3存储桶中,以便我可以使用该Id删除堆栈,而无需手动转到AWS cloudformation控制台删除它。

我已经按照下面的@ataylor的建议尝试但是我得到了错误

"在响应的JSON序列化期间发生错误:datetime.datetime(2016,7,12,15,23,16,451000,tzinfo = tzlocal())不是JSON可序列化的"

import boto3
import time
import json

client = boto3.client('cloudformation')


response = client.describe_stack_resources(
    StackName='Mystack',
    LogicalResourceId='Ec2Stack'
)

def lambda_handler(event, context):
        return response

我还试过下面的代码并收到错误

"在响应的JSON序列化期间发生错误:cloudformation.StackResource(stack_name =' Mystack',logical_id =' Ec2Stack')不是JSON可序列化的&# 34;

import boto3
import time
import json

cloudformation = boto3.resource('cloudformation')
stack_resource = cloudformation.StackResource('prodUpgradeForchestartorFullStack','ApplicationStack')

def lambda_handler(event, context):
        return stack_resource

请建议!!

1 个答案:

答案 0 :(得分:1)

您可以从CloudFormation API获取堆栈名称。特别是,如果您的父堆栈被称为Ec2Stack,您可以从命令行获取嵌套堆栈的名称:

aws cloudformation describe-stack-resources \
    --query StackResources[].[PhysicalResourceId][] \
    --stack-name Ec2Stack

如果您拥有逻辑ID并且想要资源的物理ID,请使用:

aws cloudformation describe-stack-resources \
    --query 'StackResources[?LogicalResourceId==`MYnestedStack`].[PhysicalResourceId][]' \
    --stack-name Ec2Stack

您可以从python中调用相同的API:http://boto3.readthedocs.io/en/latest/reference/services/cloudformation.html#stackresource

如果要删除堆栈,可以直接从API使用它,或将其保存到S3。