如何让AWS Glue Job CDK构造随脚本资产更新同步更新任务
问题现象
使用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

