CDK Python部署Sagemaker模型:角色依赖与类型错误求助
解决CDK部署Sagemaker模型时的角色不存在与依赖添加错误问题
问题根源
- 代码中先创建Sagemaker模型,后定义IAM角色,导致CDK生成部署模板时,模型资源会优先于角色被创建,触发“角色不存在”的错误。
- 调用
add_depends_on时传入的Role是L2构造对象,而该方法要求传入CfnResource类型的底层资源,因此报错。
解决方案
方案1:调整资源创建顺序(推荐)
CDK会自动根据资源间的引用关系生成依赖,只要先创建IAM角色,再创建Sagemaker模型,就能自动保证角色先被创建,无需手动添加依赖。
修正后的代码:
# 先创建IAM角色 model_role = Role( self, f"{construct_id}_role", assumed_by=ServicePrincipal("sagemaker.amazonaws.com"), ) model_role.add_to_policy(PolicyStatement( resources=["*"], actions= [ "cloudwatch:PutMetricData", "logs:CreateLogStream", "logs:PutLogEvents", "logs:CreateLogGroup", "logs:DescribeLogStreams", "s3:GetObject", "s3:ListBucket", "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ] )) # 再创建Sagemaker模型,引用已创建的角色ARN sagemaker_model = aws_sagemaker.CfnModel( self, model_name, execution_role_arn=model_role.role_arn, model_name=model_name, primary_container=sagemaker_primary_container_definition, )
方案2:手动添加依赖(仅特殊场景使用)
如果因某些原因无法调整创建顺序,可通过角色的底层CfnResource对象添加依赖:
# 创建角色后,获取其底层CfnRole资源 cfn_model_role = model_role.node.default_child # 给Sagemaker模型添加依赖 sagemaker_model.add_depends_on(cfn_model_role)
说明
- 优先使用方案1,CDK的自动依赖管理能避免手动维护依赖带来的失误。
node.default_child用于获取L2构造对应的底层Cfn资源,是CDK中处理L2构造与Cfn资源依赖的标准方式。
内容的提问来源于stack exchange,提问作者Sazzad
相关产品推荐
相关产品推荐

