如何在AWS SAM应用中自动构建含Python脚本的Glue Job部署包
SAM 内置Glue脚本自动打包实现方案
你需要的类Lambda的打包部署体验完全可以实现,无需在SAM外手动打包上传代码。可以按照以下方案配置:
方案1:原生自动打包(无额外依赖的单脚本场景)
SAM CLI 1.38.0及以上版本已经原生支持AWS::Glue::Job资源的脚本自动上传,无需额外配置:
- 把Glue Python脚本放在SAM项目目录内,比如
./glue_scripts/etl_job.py - 直接在模板的Glue Job配置中引用本地路径即可
Resources: # Glue作业执行角色,按需配置权限 GlueJobRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: glue.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws-cn:iam::aws:policy/service-role/AWSGlueServiceRole MyETLJob: Type: AWS::Glue::Job Properties: Name: my-etl-job Role: !GetAtt GlueJobRole.Arn GlueVersion: "4.0" Command: Name: glueetl PythonVersion: "3" ScriptLocation: ./glue_scripts/etl_job.py # 直接写本地相对路径 WorkerType: G.1X NumberOfWorkers: 2
执行sam build && sam deploy时,SAM会自动把本地脚本上传到部署桶,自动替换模板中的路径为对应S3地址。
方案2:类Lambda打包(有依赖、多文件场景)
如果你的Glue作业需要依赖第三方库、或者包含多个公共模块需要打包成zip,可以借助SAM对Lambda代码的打包能力实现完全一致的体验:
- 项目目录结构参考:
your-sam-project/ ├── template.yaml └── glue_scripts/ ├── etl_job.py # 作业入口脚本 ├── common_utils.py # 自定义公共模块 └── requirements.txt # 第三方依赖声明
- 模板配置如下:
Resources: GlueJobRole: Type: AWS::IAM::Role Properties: # 同方案1的角色配置,省略重复内容 # 借助Lambda打包逻辑处理Glue代码,不会实际部署Lambda函数 GlueCodePackage: Type: AWS::Serverless::Function Properties: CodeUri: ./glue_scripts/ Runtime: python3.10 Handler: etl_job.lambda_handler # 随便填写即可,不会实际调用 # 如果不需要安装依赖,添加下面的Metadata加快构建 # Metadata: # SkipBuild: True MyETLJob: Type: AWS::Glue::Job Properties: Name: my-etl-job Role: !GetAtt GlueJobRole.Arn GlueVersion: "4.0" Command: Name: glueetl PythonVersion: "3" # 引用打包后的zip包,#后面跟zip包内的入口脚本路径 ScriptLocation: !Sub "s3://${GlueCodePackage.Code.S3Bucket}/${GlueCodePackage.Code.S3Key}#etl_job.py" WorkerType: G.1X NumberOfWorkers: 2
这种方案下,SAM会自动执行pip install -r requirements.txt安装依赖、打包成zip、上传到S3,每次代码变更执行sam deploy都会自动同步更新Glue作业的脚本,和Lambda的部署体验完全一致。
注意事项
- 执行部署前无需提前手动打包代码、上传S3,所有流程都由SAM自动完成
- 如果Glue作业需要访问其他AWS资源,记得给Glue执行角色添加对应的权限
内容的提问来源于stack exchange,提问作者Wev
相关产品推荐
相关产品推荐

