Serverless Framework创建Glue Job无法使用本地路径的问题排查
关于Serverless Framework创建AWS Glue Job本地脚本路径问题的解答
核心原因:AWS Glue的原生要求,而非Serverless限制
AWS Glue Job的运行环境是AWS托管的,它无法直接访问你本地或Serverless部署包内的文件——所有执行脚本必须存储在S3上。Serverless Framework只是负责编排AWS资源,底层完全遵循Glue的规则,所以不是Serverless的限制。
两种可行解决思路:自动上传本地脚本到S3
不管用不用插件,核心都是让Serverless在部署阶段把本地脚本传到S3,再将Glue Job的脚本路径指向这个S3位置。下面是具体方案:
方案1:无需插件,手动配置CloudFormation资源
你可以直接在serverless.yml中定义S3桶(或复用Serverless自动创建的部署桶),并通过AWS::Glue::Job资源指定S3脚本路径:
service: glue-job-demo provider: name: aws runtime: python3.9 region: us-east-1 resources: Resources: # 可选:如果没有现成的S3桶,创建一个专门存Glue脚本 GlueScriptBucket: Type: AWS::S3::Bucket Properties: BucketName: my-glue-scripts-${self:provider.region} # 定义Glue Job MyETLJob: Type: AWS::Glue::Job Properties: Name: MyETLJob Role: !GetAtt GlueExecutionRole.Arn Command: Name: glueetl # 用自定义桶的路径,或者复用Serverless部署桶:s3://${ServerlessDeploymentBucket}/Glue_Jobs/my-script.py ScriptLocation: !Sub s3://${GlueScriptBucket}/Glue_Jobs/my-script.py WorkerType: G.1X NumberOfWorkers: 2 # 定义Glue执行角色 GlueExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: { Service: glue.amazonaws.com } Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole # 确保本地脚本被打包进Serverless部署包 package: include: - Glue_Jobs/**
部署后,Serverless会把Glue_Jobs下的文件上传到部署桶,你可以直接复用部署桶的路径,或者通过AWS CLI/控制台把脚本复制到自定义的Glue脚本桶。
方案2:正确配置serverless-glue插件
如果用serverless-glue插件失效,大概率是配置步骤遗漏或错误,以下是标准流程:
- 安装插件:
npm install serverless-glue --save-dev
- 在
serverless.yml中正确配置插件和Glue Job:
service: glue-job-demo provider: name: aws region: us-east-1 # 声明使用插件 plugins: - serverless-glue # 配置Glue Job custom: glue: jobs: MyETLJob: command: name: glueetl # 直接填本地脚本的相对路径,插件会自动上传到S3 scriptLocation: Glue_Jobs/my-script.py role: !GetAtt GlueExecutionRole.Arn workerType: G.1X numberOfWorkers: 2 # 可选:指定自定义S3桶存储脚本,不填则插件自动创建 # scriptBucket: my-glue-scripts-${self:provider.region} resources: Resources: GlueExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: { Service: glue.amazonaws.com } Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
如果插件还是不生效,排查以下几点:
- 本地脚本路径是否正确,确保文件存在于项目目录中
- 查看部署日志,检查插件是否有报错(比如S3上传权限不足)
- 确认你的AWS账号拥有
S3:PutObject、Glue:CreateJob等必要权限
总结
问题根源是AWS Glue的原生要求,而非Serverless Framework的限制。解决的核心是让部署流程自动将本地脚本同步到S3,你可以选择手动配置CloudFormation资源,或者通过正确配置serverless-glue插件来简化流程。
内容的提问来源于stack exchange,提问作者Marcus Lagerstedt
相关产品推荐
相关产品推荐

