我正在使用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: {}
答案 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)
@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
无效。