CDK为CfnCrawler生成空目标

时间:2019-06-03 21:49:03

标签: aws-cdk

我正在使用CDK Python API定义Glue搜寻器,但是CDK生成的模板在Crawler资源中包含空的“ Targets”块。

我找不到能效仿的例子。我尝试过更改目标对象的定义,但是CDK似乎忽略了该对象定义。

from aws_cdk import cdk

BUCKET='poc-1-bucket43879c71-5uabw2rni0cp'

class PocStack(cdk.Stack):

    def __init__(self, app: cdk.App, id: str, **kwargs) -> None:
        super().__init__(app, id)

        from aws_cdk import (
            aws_iam as iam,
            aws_glue as glue,
            cdk
        )

        glue_role = iam.Role(
            self, 'glue_role',
            assumed_by=iam.ServicePrincipal('glue.amazonaws.com'),
            managed_policy_arns=['arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole']
        )

        glue_crawler = glue.CfnCrawler(
            self, 'glue_crawler',
            database_name='db',
            role=glue_role.role_arn,
            targets={"S3Targets": [{"Path": f'{BUCKET}/path/'}]},
        )

我希望生成的模板包含带有单个S3Target的有效“ targets”块。但是,cdk synth在AWS :: Glue :: Crawler资源中输出带有空Targets的模板:

  gluecrawler:
    Type: AWS::Glue::Crawler
    Properties:
      DatabaseName: db
      Role:
        Fn::GetAtt:
          - glueroleFCCAEB57
          - Arn
      Targets: {}

2 个答案:

答案 0 :(得分:1)

已解决,感谢一位聪明的同事! 将“ S3Targets”更改为“ s3Targets”,将“ Path”更改为“ path”解决了该问题。见下文。

  

鲍勃,你好

     

使用打字稿时,以下内容对我有用:

new glue.CfnCrawler(this, 'glue_crawler', {
      databaseName: 'db',
      role: glue_role.roleArn,
      targets: {
        s3Targets: [{ path: "path" }]
      }
    }
     

当我使用Python时,以下内容也可以工作:

glue_crawler = glue.CfnCrawler(
            self, 'glue_crawler',
            database_name='db',
            role=glue_role.role_arn,
            targets={
                "s3Targets": [{ "path": f'{BUCKET}/path/'}]
            },
        )
     

在Typescript中,TargetsProperty是一个以s3Targets作为属性的接口。而在   s3Targets,路径也是一个属性。我猜在JSII转换过程中,   我们在Python中使用相同的名称,而不是初始CFN资源名称。

答案 1 :(得分:0)

解决此问题的更通用方法是分两步在cdk库中进行挖掘:

1。

from aws_cdk import aws_glue
print(aws_glue.__file__)
(.env/lib/python3.8/site-packages/aws_cdk/aws_glue/__init__.py)
  1. 转到该文件,然后查看如何定义映射/类型。截至2020年8月16日,您发现
@jsii.data_type(
    jsii_type="@aws-cdk/aws-glue.CfnCrawler.TargetsProperty",
    jsii_struct_bases=[],
    name_mapping={
        "catalog_targets": "catalogTargets",
        "dynamo_db_targets": "dynamoDbTargets",
        "jdbc_targets": "jdbcTargets",
        "s3_targets": "s3Targets",
    }
)

我发现lowerCamelCase始终有效,而Pythonic snake_case无效。