Aws cdk 无法在AWS CDK中使用Python创建CfnSpotFleet

Aws cdk 无法在AWS CDK中使用Python创建CfnSpotFleet,aws-cdk,Aws Cdk,在运行CDK synth时,我遇到了JSII错误 jsii.errors.JSIIError: Value did not match any type in union: Value did not match any type in union: Expected array type, got {"$jsii.struct":{"fqn":"@aws-cdk/aws-ec2.CfnSpotFleet.SpotFleetLaunchSpecificationProperty", 我创建了一

在运行CDK synth时,我遇到了JSII错误

jsii.errors.JSIIError: Value did not match any type in union: Value did not match any type in union: Expected array type, got {"$jsii.struct":{"fqn":"@aws-cdk/aws-ec2.CfnSpotFleet.SpotFleetLaunchSpecificationProperty",
我创建了一个spot fleet堆栈,当我定义
cfnspotfeet
时,我看到了
jsiError

batch_workers_request_config_data = ec2.CfnSpotFleet.SpotFleetRequestConfigDataProperty(
            iam_fleet_role=spotfleet_role.role_arn,
            target_capacity=num_of_workers,
            instance_interruption_behavior='terminate',
            launch_specifications=batch_workers_launch_specification
        )
        ec2.CfnSpotFleetProps(spot_fleet_request_config_data=batch_workers_request_config_data)

        ec2.CfnSpotFleet(self, id=f'{id}-spot-fleet',
                         spot_fleet_request_config_data=batch_workers_request_config_data)
**CLI版本:aws CLI/1.17.0 Python/3.8.1 Darwin/18.7.0 botocore/1.14.0。
**框架版本(CDK):1.30.0(构建4f54ff7)。
**操作系统:MacOS 10.14.6.
**语言:英语

我还尝试为
spot\u fleet\u request\u config\u data

ec2.CfnSpotFleet(self, id=f'{id}-spot-fleet',
                         spot_fleet_request_config_data=ec2.CfnSpotFleetProps(
                             spot_fleet_request_config_data=[batch_workers_request_config_data]))
为此,我收到了一个不同的错误:
jsii.errors.JSIIError:值与联合中的任何类型都不匹配:获取了一个数组,其中应包含@aws cdk/aws-ec2.cfnspotflete.SpotFleetRequestConfigDataProperty。您的意思是要传递可变数量的参数吗?应为对象引用,获得[{“$jsii.struct”:{“fqn”:“@aws cdk/aws-ec2.cfnspotflete.SpotFleetRequestConfigDataProperty”,“数据:{……。

我正在查看python库,发现
cfnspotfilet
没有
cfnspotfiletprops
所具有的JSII注释。不过,我并不确定这是否导致了这个问题

@jsii.data_type(jsii_type="@aws-cdk/aws-ec2.CfnSpotFleetProps", jsii_struct_bases=[], name_mapping={'spot_fleet_request_config_data': 'spotFleetRequestConfigData'})
如果需要其他信息,请告诉我

====更新====

感谢@dmahapatro指出正确设置的实际属性。我能够使堆栈正常工作。如果其他人通过CDK创建SpotFleet,这里是解决方案

ec2.AmazonLinuxImage()    
ec2_instance_profile = iam.CfnInstanceProfile(self, f'{id}-spot-ec2-profile', roles=[batch_iam_role.role_name])
batch_workers_tags = ec2.CfnSpotFleet.SpotFleetTagSpecificationProperty(resource_type='instance',
                                                                        tags=[
                                                                            core.CfnTag(key='Name',
                                                                                        value=f'{id}-worker-ec2'),
                                                                            core.CfnTag(key='batch.role',
                                                                                        value=f'{id}-worker'),                                                                  
                                                                        ])

block_device_mapping = ec2.CfnSpotFleet.BlockDeviceMappingProperty(device_name='/dev/sda1',
                                                                   ebs=ec2.CfnSpotFleet.EbsBlockDeviceProperty(
                                                                       volume_size=64))

batchworker_spotfleet_iam_role = iam.Role(
    self,
    'AmazonEC2SpotFleetRole',
    assumed_by=iam.ServicePrincipal('spotfleet.amazonaws.com'),
    managed_policies=[
        iam.ManagedPolicy.from_aws_managed_policy_name('service-role/AmazonEC2SpotFleetTaggingRole')
    ]
)

batchworker_iam_profile_spec = ec2.CfnSpotFleet.IamInstanceProfileSpecificationProperty(
    arn=ec2_instance_profile.attr_arn)

batch_workers_launch_specification = ec2.CfnSpotFleet.SpotFleetLaunchSpecificationProperty(
    image_id=ec2_image_id,
    instance_type=ec2_instance_type,
    key_name=ec2_ssh_key,
    block_device_mappings=[block_device_mapping],
    iam_instance_profile=batchworker_iam_profile_spec,
    tag_specifications=[batch_workers_tags],
    security_groups=[ec2.CfnSpotFleet.GroupIdentifierProperty(group_id=security_group.security_group_id)],
)

batch_workers_request_config_data = ec2.CfnSpotFleet.SpotFleetRequestConfigDataProperty(
    iam_fleet_role=batchworker_spotfleet_iam_role.role_arn,
    target_capacity=num_of_workers,
    instance_interruption_behavior='terminate',
    launch_specifications=[batch_workers_launch_specification]
)

ec2.CfnSpotFleet(self, id=f'{id}-spot-fleet',
                 spot_fleet_request_config_data=batch_workers_request_config_data)

如果您查看中的CloudFormation文档,您将看到
LaunchSpecification
需要一个
SpotFleetLaunchSpecification

不确定批处理工人启动规范的值是多少,因为问题中未显示该规范,但如果它不表示数组,则应在下面修复它:

batch_workers_request_config_data = 
ec2.CfnSpotFleet.SpotFleetRequestConfigDataProperty(
    iam_fleet_role=spotfleet_role.role_arn,
    target_capacity=num_of_workers,
    instance_interruption_behavior='terminate',
    launch_specifications=[batch_workers_launch_specification]
)

请留下DownVoting的原因非常感谢您指出实际错误以及我设置的参数不正确。我用对我有效的解决方案更新了问题。祝您度过愉快的一天!
batch_workers_request_config_data = 
ec2.CfnSpotFleet.SpotFleetRequestConfigDataProperty(
    iam_fleet_role=spotfleet_role.role_arn,
    target_capacity=num_of_workers,
    instance_interruption_behavior='terminate',
    launch_specifications=[batch_workers_launch_specification]
)