3

我正在使用 CDK Python API 来定义 Glue 爬虫,但是,CDK 生成的模板在 Crawler 资源中包含空的“目标”块。

我一直无法找到一个可以效仿的例子。我尝试改变目标对象的定义,但对象定义似乎被 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 的有效“目标”块。但是,cdk synth在 AWS::Glue::Crawler 资源中输出一个带有空目标的模板:

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

2 回答 2

3

已解决,感谢一位聪明的同事!将“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 资源名称。

于 2019-06-04T19:21:53.550 回答
1

解决此问题的更通用方法是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总是有效,而 pythonicsnake_case却没有。

于 2020-08-16T08:11:42.050 回答