由于我是AWS CDK和CloudFormation的新手,我一直在创建ssm.CfnAssociation。我正在尝试通过ssm.CfnAssociation创建AWS Systems Manager State Manager任务(AWS-RunAnsiblePlaybook),但我对如何定义参数有误解?我想在参数中设置url为s3的剧本。从CDK文档来看,应该是:parameters (Union[IResolvable, None, Mapping[str, Union[IResolvable, Forwardref]]]) – AWS::SSM::Association.Parameters.
由AWS docks Type: Map of ParameterValues -> { "ParameterValues" : [ String, ... ] }提供
我尝试过为参数定义各种类型,但总是出现错误:Value did not match any type in union: Expected object reference, got {"plybook":"s3-url"},Value did not match any type in union: Expected object reference, got "s3-url",Expected object reference, got "s3-url"如果我使用ssm.CfnAssociation.ParameterValuesProperty来匹配密钥playbookurl,那么在部署步骤中就会出现错误:SSMAssociation/SSMAssociation (SSMAssociation6148DA19) Value of {Parameters} must be a map where each value is a list of {String}
你能帮我解决这个问题吗?因为我不知道参数应该是什么类型的以及如何合适的?谢谢。
class SSMAssociation(core.Construct):
def __init__(self, scope: core.Construct, id: str,
ssm_association_name: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
ssm_param_values = ssm.CfnAssociation.ParameterValuesProperty(
parameter_values=["s3://test-ansible-test1-pl1/playbook1.yml"],
)
ssm_tartgets = ssm.CfnAssociation.TargetProperty(
key="CDK-Type",
values="EC2Instance",
),
ssm_association = ssm.CfnAssociation(
self, "SSMAssociation",
name=ssm_association_name,
output_location=None,
parameters={
"playbookurl": ssm_param_values,
},
targets=None,
)发布于 2019-10-18 15:51:45
目前,解决这个问题的方法是使用CfnInclude而不是CfnAssociation。但在我看来,以适当的方式使用CfnAssociation会更好。
class SSMAssociationConstruct(core.Construct):
def __init__(self, scope: core.Construct, id: str,
playbook_url: str,
ec2_tag_key: str,
ec2_tag_value: str,
**kwargs) -> None:
super().__init__(scope, id, **kwargs)
if playbook_url is not None:
cfn_include = core.CfnInclude(
self, "CfnInclude",
template={
"Resources": {
"SSMAssociation": {
"Type" : "AWS::SSM::Association",
"Properties" : {
"AssociationName" : "SSMRunAnsible" ,
"Name" : "AWS-RunAnsiblePlaybook",
"ScheduleExpression": "cron(0 0/30 * * * ? *)",
"Parameters" : {
"playbookurl":[playbook_url],
},
"Targets" : [{
"Key": f"tag:{ec2_tag_key}",
"Values": [f"{ec2_tag_value}"]
}]
}
}
}
}
)发布于 2019-12-13 09:26:41
如上所述,根据python docs,参数是(Union[IResolvable, None, Mapping[str, Union[IResolvable, Forwardref]]]) – AWS::SSM::Association.Parameters,所以您所做的是正确的
我刚刚验证了cdk synth是否接受:
ssm_param_values = ssm.CfnAssociation.ParameterValuesProperty(
parameter_values=["s3://test-ansible-test1-pl1/playbook1.yml"],
)
ssm_association = ssm.CfnAssociation(
self, "SSMAssociation",
name=ssm_association_name,
output_location=None,
parameters={
"playbookurl": ssm_param_values,
},
targets=None,
)在以下版本中
Python 3.7.4
aws-cdk.aws-events==1.18.0
aws-cdk.aws-iam==1.18.0
aws-cdk.aws-kms==1.18.0
aws-cdk.aws-s3==1.18.0
aws-cdk.aws-ssm==1.18.0
aws-cdk.core==1.18.0
aws-cdk.cx-api==1.18.0
aws-cdk.region-info==1.18.0
然而,部署问题仍然存在,看起来你应该使用ssm_param_values.parameter_values,但是它不被CDK接受。
已提交issue on CDK,尽管它可能是CF错误。
CF documentation肯定是误导性的,报道的反馈:
Parameters is just a key: value pair map[Parameters][4]指定了[ParameterValues][5]的映射,匹配的行为
https://stackoverflow.com/questions/58328181
复制相似问题