You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让AWS Glue Job CDK构造随脚本资产更新同步更新任务

AWS CDK中Glue Job同步S3 Asset脚本更新的解决方案

问题现象

使用AWS CDK定义Glue Job与S3 Asset后,首次资源创建正常,但更新本地脚本文件后,Glue Job并未同步关联的S3脚本资源,导致Job仍然执行旧版本脚本。

原因分析

CDK的S3 Asset会根据文件内容生成唯一哈希值,并将该哈希作为S3对象键的一部分。但直接使用dynamodb_etl_job_script.s3_object_url传递给Glue Job的script_location时,CDK无法感知到Asset内容变化对Glue Job的影响——因为glue.CfnJob资源没有明确绑定到Asset的哈希依赖,导致CDK认为Glue Job的属性未发生变化,不会触发更新。

解决方案

1. 基于Asset的Bucket和Key构造脚本路径

不要直接使用s3_object_url,而是通过Asset的bucket和s3_object_key拼接完整的S3路径。这样当Asset内容更新时,s3_object_key会因哈希变化而改变,CDK会检测到Glue Job的script_location属性变更,从而自动更新Job配置。

修改后的完整代码:

dynamodb_etl_job_script = s3_assets.Asset(self, "dynamodb-etl-job", path="assets/dynamodb-etl-job.py")

# 提取Asset的Bucket名称和对象Key
script_bucket_name = dynamodb_etl_job_script.bucket.bucket_name
script_s3_key = dynamodb_etl_job_script.s3_object_key

etl_job = glue.CfnJob(self,
    f"etl-{dynamodb_table_name}-glue-job",
    name=f"ETL-{dynamodb_table_name}-glue-job",
    role=f"arn:aws:iam::{self.account}:role/{crawler_role_name}",
    command=glue.CfnJob.JobCommandProperty(
        name="glueetl",
        # 用Bucket和Key拼接脚本路径
        script_location=f"s3://{script_bucket_name}/{script_s3_key}",
        python_version="3"
    ),
    default_arguments={
        "--enable-metrics": "true",
        "--enable-spark-ui": "true",
        "--extra-py-files": "s3://aws-glue-studio-transforms-510798373988-prod-us-east-1/gs_common.py,s3://aws-glue-studio-transforms-510798373988-prod-us-east-1/gs_flatten.py",
        "--spark-event-logs-path": f"s3://{glue_asset_bucket.bucket_name}/sparkHistoryLogs/",
        "--enable-job-insights": "true",
        "--enable-observability-metrics": "true",
        "--enable-glue-datacatalog": "true",
        "--enable-continuous-cloudwatch-log": "true",
        "--job-bookmark-option": "job-bookmark-enable",
        "--job-language": "python",
        "--TempDir": f"s3://{glue_asset_bucket.bucket_name}/temporary/",
        "--enable-auto-scaling": "true",
        "--glue-asset-bucket-name": glue_asset_bucket_name,
        "--glue-database-name": glue_database_name,
        "--glue-table-name": table_prefix+dynamodb_table_name,
        "--dynamodb-table-arn": boto3_dynamodb_table.table_arn,
        "--dynamodb-table-name": dynamodb_table_name,
        "--glue-export-bucket-name": glue_export_bucket_name,
    },
    max_retries=0,
    timeout=glue_job_timeout,
    number_of_workers=glue_job_number_of_workers,
    worker_type=glue_job_worker_type,
    glue_version="4.0"
)

2. 附加Asset哈希作为Job参数(可选增强)

如果希望更明确地触发Glue Job更新,可以将Asset的哈希值添加到Job的默认参数中。当脚本内容变化时,哈希值改变,CDK会检测到Job参数变更,强制更新Job配置。

在default_arguments中添加以下条目:

"--script-content-hash": dynamodb_etl_job_script.asset_hash,

3. 验证Asset配置

确保Asset使用默认的asset_hash_type(即cdk.AssetHashType.SOURCE),该配置会基于文件内容生成哈希,确保内容变化时哈希值必然改变。无需额外配置,CDK默认已启用此设置。

验证方法

修改本地脚本文件后,执行cdk diff命令,应该能看到Glue Job的script_location(或添加的哈希参数)发生变化,随后执行cdk deploy即可完成同步更新。

内容的提问来源于stack exchange,提问作者Josh Russo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:57:41