Я хочу создать облако и S3, а затем внести журнал в S3.
Итак, мой код выглядит следующим образом:
const bk = new s3.Bucket(this, `cm-st-cloudfront-bk`, {
bucketName: s3_name,
removalPolicy: RemovalPolicy.DESTROY,
autoDeleteObjects: true,
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
//
encryption: s3.BucketEncryption.S3_MANAGED,
versioned:true,
});
const oai = new cloudfront.OriginAccessIdentity(this, `my-oai`,{
comment:`Access identity for ${targetEnv}`
});
const cf = new cloudfront.CloudFrontWebDistribution(this, `Website-${targetEnv}-Distribution`, {
comment:`CF for resource S3 ${targetEnv}`,
viewerCertificate: {
aliases: [],
props: {
cloudFrontDefaultCertificate: true,
},
},
errorConfigurations: [
{
errorCode: 403,
responsePagePath: "/index.html",
responseCode: 200,
errorCachingMinTtl: 0,
},
{
errorCode: 404,
responsePagePath: "/index.html",
responseCode: 200,
errorCachingMinTtl: 0,
},
],
loggingConfig: {
bucket: bk,
prefix: "cloudfront/",
},
});
В этой настройке возникает эта ошибка.
Bucket cannot have public ACLs set with BlockPublicAccess enabled
Поэтому я меняю
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
к
//blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
Однако происходит та же ситуация.
Bucket cannot have public ACLs set with BlockPublicAccess enabled
Как я могу решить эту проблему, и мне интересно, невозможно ли для Cloudfront войти в S3 с включенным Block public access?
Благодаря ответу @Dhruv я изменился вот так:
const bk = new s3.Bucket(this, `cm-st-cloudfront-bk`, {
bucketName: s3_name,
removalPolicy: RemovalPolicy.DESTROY,
autoDeleteObjects: true,
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ACLS
encryption: s3.BucketEncryption.S3_MANAGED,
versioned:true,
});
bk.addToResourcePolicy(new iam.PolicyStatement({
actions: ['s3:PutObject'],
effect: iam.Effect.ALLOW,
resources: [bk.arnForObjects('*')],
principals: [new iam.ServicePrincipal('delivery.logs.amazonaws.com')],
}));
const oai = new cloudfront.OriginAccessIdentity(this, `my-oai`,{
comment:`Access identity for ${targetEnv}`
});
const cf = new cloudfront.CloudFrontWebDistribution(this, `Website-${targetEnv}-Distribution`, {
comment:`CF for resource S3 ${targetEnv}`,
viewerCertificate: {
aliases: [],
props: {
cloudFrontDefaultCertificate: true,
},
},
errorConfigurations: [
{
errorCode: 403,
responsePagePath: "/index.html",
responseCode: 200,
errorCachingMinTtl: 0,
},
{
errorCode: 404,
responsePagePath: "/index.html",
responseCode: 200,
errorCachingMinTtl: 0,
},
],
loggingConfig: {
bucket: bk,
prefix: "cloudfront/",
},
});
Теперь возникает эта ошибка, Invalid request provided: The S3 bucket that you specified for CloudFront logs does not enable ACL access






Это связано с тем, что CloudFront требуется доступ на запись в корзину S3 для хранения журналов доступа.
Вы можете настроить политику корзины S3, чтобы разрешить доступ на запись только из субъекта-службы ведения журналов CloudFront. Вы можете изменить определение корзины S3, чтобы CloudFront мог записывать журналы, но при этом блокировал публичный доступ:
// Allow CloudFront logging service principal to write access logs to the bucket
bk.addToResourcePolicy(new iam.PolicyStatement({
actions: ['s3:PutObject'],
effect: iam.Effect.ALLOW,
resources: [bk.arnForObjects('*')],
principals: [new iam.ServicePrincipal('delivery.logs.amazonaws.com')],
}));
Используйте blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL в конфигурации сегмента.
Спасибо, я использовал objectOwnership: s3.ObjectOwnership.BUCKET_OWNER_PREFERRED вместо blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, и это работает.
Большое спасибо, сейчас для этого создается новая политика, но возникает другая ошибка
The S3 bucket that you specified for CloudFront logs does not enable ACL access.