首页 > 解决方案 > 尝试使用 aws-cdk 向 s3 日志交付组授予完整权限

问题描述

我目前正在使用 aws-cdk 创建一个中央日志存储桶,所有现有的 s3 存储桶都将登录到该存储桶。当我手动提供“s3LogDeliveryGroup”列表对象、写入对象、读取桶权限和写入桶权限时,一切正常。但是,我正在使用 aws-cdk 并且需要以编程方式执行此操作,以便可以将其部署到任何帐户。这是我的代码:

const s3PublicAccessLambda = new lambda.Function(this, 's3PublicAccessLambda',{
        runtime: lambda.Runtime.PYTHON_3_6,
        handler: 's3PublicAccess.handler',
        role:s3LoggingLambdaRole,
        code: lambda.Code.fromAsset(path.join(__dirname, '../lambda')),
        timeout: cdk.Duration.seconds(300) 

      });

      const centralLoggingBucket = new s3.Bucket(this, 'centralLoggingBucket', {
        accessControl:s3.BucketAccessControl.BUCKET_OWNER_FULL_CONTROL

      });
      centralLoggingBucket.grantReadWrite(s3LoggingLambdaRole);
  
      }
    }

运行此代码时不会发生错误,但是除非我手动授予权限,否则存储桶不会记录。我知道我需要在我指定'accessControl'参数的地方附近指定它,我只是不知道确切的位置。谢谢!!

标签: boto3aws-cdk

解决方案


如果您正在寻找一种方法来为s3LoggingLambdaRolelambda 函数所承担的角色提供 S3 存储桶访问策略,您可以尝试像这样附加内联策略:

s3LoggingLambdaRole.attachInlinePolicy(
    new Policy(this, 'yourPolicy', {
        policyName: 'yourPolicyName',
            statements: [
                new PolicyStatement({
                    actions: ['s3:ListObjects', 's3:WriteObjects'],
                    resources: [`arn:aws:s3:::`, `arn:aws:s3:::*`, 'arn:aws:s3:::*/*'],
                }),
            ],
        }),
    );

此外,请记住,如果您提供了自己的自定义 IAM 角色,则不会自动授予执行 lambda 的权限,因此您可能还必须添加以下托管策略。

s3LoggingLambdaRole.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaBasicExecutionRole"));
s3LoggingLambdaRole.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole")); // only required if your function lives in a VPC

推荐阅读