[英]AWS Lambda for calling a python function gives Key Error
I am working on an AWS lambda function that calls python functions and prints what my python function prints. 这是我的 python function 名为“template_utils.py”
import json
import meta_templates
from jinja2 import Template
def create_aws_iam_policy_template(**kwargs):
template_data = {}
template_data["region"] = kwargs.get('region')
template_data["instance_types"] = kwargs.get('instance_type')
template_data["ebs_volume_size"] = kwargs.get('ebs_volume_size')
template_data["meta_template_name"] = kwargs.get('meta_template_name')
meta_template_dict = getattr(meta_templates, template_data["meta_template_name"])
meta_template_json = json.dumps(meta_template_dict)
template_json = Template(meta_template_json).render(template_data)
return template_json
template_json = create_aws_iam_policy_template(
region="us-east-2",
instance_type="t2.micro",
ebs_volume_size="20",
meta_template_name="ec2_policy_meta_template"
)
print(template_json)
这是我的 AWS lambda function:
import json
import meta_templates
from jinja2 import Template
from template_utils import create_aws_iam_policy_template
def lambda_handler(event, context):
template_data = {}
region = event.get('region')
instance_type = event.get('instance_type')
ebs_volume_size = event.get('ebs_volume_size')
template_data["meta_template_name"] = event.get('meta_template_name')
meta_template_dict = getattr(meta_templates, template_data["meta_template_name"])
meta_template_json = json.dumps(meta_template_dict)
template_json = Template(meta_template_json).render(template_data)
return template_json
template_json = create_aws_iam_policy_template(
region="us-east-2",
instance_type="t2.micro",
ebs_volume_size="20",
meta_template_name="ec2_policy_meta_template"
)
print(template_json)
这是我得到的错误:
{
"errorMessage": "getattr(): attribute name must be string",
"errorType": "TypeError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 12, in lambda_handler\n meta_template_dict = getattr(meta_templates, template_data[\"meta_template_name\"])\n"
]
}
这是我的 IAM 策略模板,名为“meta_templates.py”
ec2_policy_meta_template = {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": [
"arn:aws:ec2:{{region}}::instance/*",
"arn:aws:ec2:{{region}}::network-interface/*",
"arn:aws:ec2:{{region}}::key-pair/*",
"arn:aws:ec2:{{region}}::security-group/*",
"arn:aws:ec2:{{region}}::subnet/*",
"arn:aws:ec2:{{region}}::volume/*",
"arn:aws:ec2:{{region}}::image/ami-*"
],
"Condition": {
"ForAllValues:NumericLessThanEquals": {
"ec2:VolumeSize": "{{ebs_volume_size}}"
},
"ForAllValues:StringEquals": {
"ec2:InstanceType": "{{instance_type}}"
}
}
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"ec2:TerminateInstances",
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": "arn:aws:ec2:{{region}}::instance/*",
"Condition": {
"ForAllValues:StringEquals": {
"ec2:InstanceType": "{{instance_type}}"
}
}
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:GetConsole*",
"cloudwatch:DescribeAlarms",
"iam:ListInstanceProfiles",
"cloudwatch:GetMetricStatistics",
"ec2:DescribeKeyPairs",
"ec2:CreateKeyPair"
],
"Resource": "*",
"Condition": {
"DateGreaterThan": {
"aws:CurrentTime": "{{start_time}}"
},
"DateLessThanEquals": {
"aws:CurrentTime": "{{end_time}}"
}
}
}
]
}
我不确定出了什么问题
您收到此错误是因为您的template_data
为空:
template_data = {}
但您正试图从中获得价值:
template_data["meta_template_name"]
因此,您必须先设置plate_data["meta_template_name"]
才能访问它。 例如:
plate_data["meta_template_name"] = event.get('meta_template_name')
meta_template_dict = getattr(meta_templates, template_data["meta_template_name"])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.