AWS CDK使用s3deploy时无中间资产桶写入权限的解决方案问询
解决方案
方案1:前置同步本地文件到目标桶(最推荐,无需修改权限和核心逻辑)
直接弃用s3deploy库,在执行cdk deploy之前先运行AWS CLI同步命令,把本地文件夹直接上传到目标桶的对应路径即可:
aws s3 sync ./job/source/ s3://<替换为你的目标桶名>/glue/job/
后续创建Glue作业的CDK代码直接引用目标桶下的glue/job/路径就行,整个流程完全不会涉及CDK的中间资产桶,刚好适配你当前仅持有目标桶权限的场景。如果文件体积大、数量多,这个方式还支持增量上传,效率比栈内处理高很多。
方案2:CDK栈内实现无中间桶上传
如果要求上传动作必须和CDK栈部署流程绑定,不想额外执行独立命令,可以通过自定义资源实现:
把本地Glue代码嵌入到自定义资源的Lambda逻辑中,由Lambda直接写入目标桶,Lambda的执行角色仅需要你已经持有的目标桶读写权限,不需要访问中间资产桶。
示例代码如下:
import aws_cdk as cdk from aws_cdk import aws_lambda, custom_resources as cr, aws_iam import os # 本地文件夹下如果有多个文件,可以批量读取压缩后再上传,这里以单文件为例 with open("./job/source/glue_job.py", "r", encoding="utf-8") as f: job_code = f.read() # 实现写入S3逻辑的Lambda write_s3_func = aws_lambda.Function(self, "WriteGlueCodeFunc", runtime=aws_lambda.Runtime.PYTHON_3_9, handler="index.handler", code=aws_lambda.Code.from_inline(f""" import boto3 s3_client = boto3.client("s3") def handler(event, context): s3_client.put_object( Bucket="{my_glue_bucket.bucket_name}", Key="glue/job/glue_job.py", Body={repr(job_code)} ) return {{"Status": "SUCCESS"}} """) ) # 授予Lambda目标桶写入权限 my_glue_bucket.grant_write(write_s3_func) # 注册为CDK自定义资源,栈部署时自动执行上传 cr.AwsCustomResource(self, "DeployGlueCode", on_create=cr.AwsSdkCall( service="Lambda", action="invoke", parameters={"FunctionName": write_s3_func.function_name} ), on_update=cr.AwsSdkCall( service="Lambda", action="invoke", parameters={"FunctionName": write_s3_func.function_name} ), policy=cr.AwsCustomResourcePolicy.from_statements([ aws_iam.PolicyStatement( actions=["lambda:InvokeFunction"], resources=[write_s3_func.function_arn] ) ]) )
方案3:调整s3deploy的资产存储配置(仅适合可修改CDK bootstrap配置的场景)
如果一定要使用s3deploy库,可以在执行CDK bootstrap时指定目标桶作为资产存储桶,让s3deploy直接把中间资产存到目标桶,但该操作需要bootstrap相关权限,权限受限场景不推荐使用。
内容的提问来源于stack exchange,提问作者Mert Ozer
相关产品推荐
相关产品推荐

