【发布时间】:2021-01-06 12:16:52
【问题描述】:
我正在编写一个 python 脚本来从另一个文件中调用一个文件中的一个变量。这是一个 IAM 用户的 IAM 策略。我有一个函数调用另一个文件中的变量 带有该函数的文件名为“template_utils.py”。我想要 JSON 格式的输出。我不确定是什么问题。
import sys
import json
import time
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 = meta_template_json.format(template_data)
return template_json
template_json = create_aws_iam_policy_template(
region="us-east2",
instance_type="t2.micro",
ebs_volume_size=20,
meta_template_name="ec2_policy_meta_template"
)
打印(template_json)
这是策略名为“meta_template.py”的文件
import json
from jinja2 import Template
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}}"
}
}
}
]
}
tm = Template(json.dumps(ec2_policy_meta_template))
parsed_policy = tm.render(region='us-east-1', ebs_volume_size='12', instance_type='t2.micro')
print(parsed_policy)
这是我在运行“template_utils.py”时遇到的错误
{"Version": "2012-10-17", "Statement": [{"Sid": "VisualEditor0", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": ["arn:aws:ec2:us-east-1::instance/*", "arn:aws:ec2:us-east-1::network-interface/*", "arn:aws:ec2:us-east-1::key-pair/*", "arn:aws:ec2:us-east-1::security-group/*", "arn:aws:ec2:us-east-1::subnet/*", "arn:aws:ec2:us-east-1::volume/*", "arn:aws:ec2:us-east-1::image/ami-*"], "Condition": {"ForAllValues:NumericLessThanEquals": {"ec2:VolumeSize": "12"}, "ForAllValues:StringEquals": {"ec2:InstanceType": "t2.micro"}}}, {"Sid": "VisualEditor1", "Effect": "Allow", "Action": ["ec2:TerminateInstances", "ec2:StartInstances", "ec2:StopInstances"], "Resource": "arn:aws:ec2:us-east-1::instance/*", "Condition": {"ForAllValues:StringEquals": {"ec2:InstanceType": "t2.micro"}}}, {"Sid": "VisualEditor2", "Effect": "Allow", "Action": ["ec2:Describe*", "ec2:GetConsole*", "cloudwatch:DescribeAlarms", "iam:ListInstanceProfiles", "cloudwatch:GetMetricStatistics", "ec2:DescribeKeyPairs", "ec2:CreateKeyPair"], "Resource": "*", "Condition": {"DateGreaterThan": {"aws:CurrentTime": ""}, "DateLessThanEquals": {"aws:CurrentTime": ""}}}]}
Traceback (most recent call last):
File "/home/pranay/Desktop/work/template_utils.py", line 18, in <module>
template_json = create_aws_iam_policy_template(
File "/home/pranay/Desktop/work/template_utils.py", line 15, in create_aws_iam_policy_template
template_json = meta_template_json.format(template_data)
KeyError: '"Version"'
【问题讨论】:
-
如果你可以直接访问数据
meta_template_name=meta_template.ec2_policy_meta_template,我不明白你为什么在meta_template_name="ec2_policy_meta_template"中使用字符串 -
您使用
JSON将ec2_policy_meta_template转换为字符串,然后您将其与format()一起使用-但format()使用{ }来识别变量,并且您拥有带有{"VERSION"...的JSON 字符串format()认为它是变量,它必须替换。而且你有更多的{和},它将像替换值的地方一样。您必须使用{{ }}来保持它们正常{ }。 -
我还看到您使用
{{region}}来放置一些值,但format()不会放置它,因为它会将{{和}}视为正常字符串。它必须是{region}。似乎您将format()与jinja2混合使用{{ }}在模板中放置元素。
标签: python python-3.x amazon-web-services boto3