我正试图编写一个lambda函数,该函数将标记ec2实例,该实例将从挂起到运行状态。但是,我在读取保存ec2实例标记的csv文件时遇到了问题。目前,我已经去了lambda返回我以下结果的地方。
START RequestId: 6290699e-4018-4801-b7a8-6b5b46f26c2a Version: $LATEST
{'Key': 'Name1', 'Value': 'Machine-1'}
{'Key': 'Name2', 'Value': 'Machine-2'}
{'Key': 'Name3', 'Value': 'Machine-3'}
END RequestId: 6290699e-4018-4801-b7a8-6b5b46f26c2a
REPORT RequestId: 6290699e-4018-4801-b7a8-6b5b46f26c2a Duration: 3306.40 ms Billed Duration: 3307 ms Memory Size: 128 MB Max Memory Used: 88 MB Init Duration: 335.79 ms
但是,我需要一个字典列表。
myList = [{'Key': 'Name1', 'Value': 'Instance-1'}, {'Key': 'Name2', 'Value': 'Instance-2'}, {'Key': 'Name3', 'Value': 'Instance-3'}]
因为剩下的代码看起来像下面的
instance_id = event['detail']['instance-id']
response = ec2_client.create_tags(
Resources=[
instance_id,
],
Tags=[
{
'Key': 'Name',
'Value': 'event_bridge_lambda_tag'
},
]
)
现在,我的lambda代码看起来像下面的
import csv
import boto3
from collections import OrderedDict
def lambda_handler(event, context):
s3_client = boto3.client("s3")
ec2_client = boto3.client("ec2")
S3_BUCKET_NAME = "tag-holds-bucket"
FILE_NAME = "tags.csv"
s3_file = s3_client.get_object(Bucket=S3_BUCKET_NAME, Key=FILE_NAME)
file_content = s3_file['Body'].read().decode('utf-8').splitlines()
myList = list()
records = csv.DictReader(file_content)
for row in records:
#print(dict(row))
myList.append(row)
myList.append(行)→输出如下所示
START RequestId: 618217d1-d1da-473f-b55e-77f1f7fe52dc Version: $LATEST
[OrderedDict([('Key', 'Name1'), ('Value', 'Instance-1')]), OrderedDict([('Key', 'Name2'), ('Value', 'Instance-2')]), OrderedDict([('Key', 'Name3'), ('Value', 'Instance-3')])]
END RequestId: 618217d1-d1da-473f-b55e-77f1f7fe52dc
REPORT RequestId: 618217d1-d1da-473f-b55e-77f1f7fe52dc Duration: 3128.39 ms Billed Duration: 3129 ms Memory Size: 128 MB Max Memory Used: 88 MB Init Duration: 330.02 ms
我不知道如何达到这样的状态
myList = [{'Key': 'Name1', 'Value': 'Instance-1'}, {'Key': 'Name2', 'Value': 'Instance-2'}, {'Key': 'Name3', 'Value': 'Instance-3'}]
我的cvs文件是这样的
tags.csv
剩下的lambda代码
instance_id = event['detail']['instance-id']
response = ec2_client.create_tags(
Resources=[
instance_id,
],
Tags=[
{
'Key': 'Name',
'Value': 'event_bridge_lambda_tag'
},
]
)
csv.DictReader
返回dict
或OrderedDict
,具体取决于您运行的Python版本。
如文档所示:
在3.6版更改:返回的行现在是OrderedDict类型。
在3.8版更改:返回的行现在是dict类型。
所以看起来你正在运行Python <3.8中的lambda函数。因此,您有两种可能将输出作为字典:
- 将lambda函数运行时间更改为更高的运行时间
- 将
OrderedDict
转换为dict
,只需使用dict方法:my_dict = dict(myList)
将collections.OrderedDict
序列化为字典列表的一种方法是使用json
库。
import json
# ...
records = csv.DictReader(file_content)
for row in records:
myList.append(row)
myList = json.loads(json.dumps(myList)) # add this line
或者你可以直接使用列表推导式
myList = [dict(item) for item in myList] # add this line