Cloudfront提供通过AWS CDK Python为S3存储桶起源创建的Access拒绝响应,而无需公共访问

桑托什

使用AWS CDK for S3存储桶创建了Cloud Front Web分发,而无需公共访问。能够创建Origin访问身份,并进行部署,但部署成功后,我会在浏览器上获得拒绝访问的响应。

从源的存储桶授予读取权限”设置设置为“否”,手动将其设置为“是”,一切都会很好,但是此设置需要通过AWS CDK和python实现。下面是我的代码。

from aws_cdk import aws_cloudfront as front, aws_s3 as s3

class CloudFrontStack(core.Stack):        
    def __init__(self, scope: core.Construct, idx: str, **kwargs) -> None:
        super().__init__(scope, idx, **kwargs)

        bucket = s3.Bucket.from_bucket_name(self, 'CloudFront',bucket_name="bucket_name")

        oia = aws_cloudfront.OriginAccessIdentity(self, 'OIA', comment="Created By CDK")
        bucket.grant_read(oia)

        s3_origin_source = aws_cloudfront.S3OriginConfig(s3_bucket_source=bucket, origin_access_identity=oia)

        source_config = aws_cloudfront.SourceConfiguration(s3_origin_source=s3_origin_source,
                                                           origin_path="bucket_path",
                                                           behaviors=[aws_cloudfront.Behavior(is_default_behavior=True)])

        aws_cloudfront.CloudFrontWebDistribution(self, "cloud_front_name",
                                                 origin_configs=[source_config],
                                                 comment='Cloud Formation created',
                                                 default_root_object='index.html')

我也尝试将权限添加到,但仍然没有运气。

policyStatement = aws_iam.PolicyStatement()
policyStatement.add_resources()

policyStatement.add_actions('s3:GetBucket*');
policyStatement.add_actions('s3:GetObject*');
policyStatement.add_actions('s3:List*');
policyStatement.add_resources(bucket.bucket_arn);
policyStatement.add_canonical_user_principal(oia.cloud_front_origin_access_identity_s3_canonical_user_id);
code_bucket.add_to_resource_policy(policyStatement);
玛哈帕特罗

我试图模仿这一点,并且能够将Cloudfront发行成功地集成到私有S3存储桶中。但是,我将TS用于堆栈。我敢肯定,将下面的代码与Python版本关联起来会很容易。假设其中有一个index.html文件dist

aws-cdk v1.31.0(截至2020年3月29日)

import { App, Stack, StackProps } from '@aws-cdk/core';
import { BucketDeployment, Source } from '@aws-cdk/aws-s3-deployment';
import { CloudFrontWebDistribution, OriginAccessIdentity } from '@aws-cdk/aws-cloudfront';
import { BlockPublicAccess, Bucket, BucketEncryption } from '@aws-cdk/aws-s3';

export class HelloCdkStack extends Stack {
  constructor(scope: App, id: string, props?: StackProps) {
    super(scope, id, props);

    const myFirstBucket = new Bucket(this, 'MyFirstBucket', {
      versioned: true,
      encryption: BucketEncryption.S3_MANAGED,
      bucketName: 'cdk-example-bucket-for-test',
      websiteIndexDocument: 'index.html',
      blockPublicAccess: BlockPublicAccess.BLOCK_ALL
    });

    new BucketDeployment(this, 'DeployWebsite', {
      sources: [Source.asset('dist')],
      destinationBucket: myFirstBucket
    });

    const oia = new OriginAccessIdentity(this, 'OIA', {
      comment: "Created by CDK"
    });
    myFirstBucket.grantRead(oia);

    new CloudFrontWebDistribution(this, 'cdk-example-distribution', {
      originConfigs: [
        {
          s3OriginSource: {
            s3BucketSource: myFirstBucket,
            originAccessIdentity: oia
          },
          behaviors: [
            { isDefaultBehavior: true }
          ]
        }
      ]
    });
  }
}

==更新== [没有Web托管的S3存储桶]

这是一个示例,其中S3用作没有Web托管的原始服务器。它按预期工作。

import { App, Stack, StackProps } from '@aws-cdk/core';
import { BucketDeployment, Source } from '@aws-cdk/aws-s3-deployment';
import { CloudFrontWebDistribution, OriginAccessIdentity } from '@aws-cdk/aws-cloudfront';
import { BlockPublicAccess, Bucket, BucketEncryption } from '@aws-cdk/aws-s3';

export class CloudfrontS3Stack extends Stack {
  constructor(scope: App, id: string, props?: StackProps) {
    super(scope, id, props);

    // Create bucket (which is not a static website host), encrypted AES-256 and block all public access
    // Only Cloudfront access to S3 bucket
    const testBucket = new Bucket(this, 'TestS3Bucket', {
      encryption: BucketEncryption.S3_MANAGED,
      bucketName: 'cdk-static-asset-dmahapatro',
      blockPublicAccess: BlockPublicAccess.BLOCK_ALL
    });

    // Create Origin Access Identity to be use Canonical User Id in S3 bucket policy
    const originAccessIdentity = new OriginAccessIdentity(this, 'OAI', {
      comment: "Created_by_dmahapatro"
    });
    testBucket.grantRead(originAccessIdentity);

    // Create Cloudfront distribution with S3 as Origin
    const distribution = new CloudFrontWebDistribution(this, 'cdk-example-distribution', {
      originConfigs: [
        {
          s3OriginSource: {
            s3BucketSource: testBucket,
            originAccessIdentity: originAccessIdentity
          },
          behaviors: [
            { isDefaultBehavior: true }
          ]
        }
      ]
    });

    // Upload items in bucket and provide distribution to create invalidations
    new BucketDeployment(this, 'DeployWebsite', {
      sources: [Source.asset('dist')],
      destinationBucket: testBucket,
      distribution,
      distributionPaths: ['/images/*.png']
    });
  }
}

==更新== [导入了S3存储桶,而不是在同一堆栈中创建]

当我们引用现有的S3存储桶时,可以重新创建该问题。

原因:问题
的根本原因在于此行代码autoCreatePolicy 将始终false用于进口的S3存储桶为了使addResourcePolicy工作正常,导入的存储桶必须已经有一个现有的存储桶策略,以便可以附加新的策略语句,或者手动创建新的存储桶策略并添加策略语句。在下面的代码中,我手动创建了存储桶策略并添加了所需的策略语句。这与github问题#941非常接近,但是细微的区别是在堆栈中创建存储桶与导入已创建的存储桶之间。

import { App, Stack, StackProps } from '@aws-cdk/core';
import { CloudFrontWebDistribution, OriginAccessIdentity } from '@aws-cdk/aws-cloudfront';
import { Bucket, BucketPolicy } from '@aws-cdk/aws-s3';
import { PolicyStatement } from '@aws-cdk/aws-iam';

export class CloudfrontS3Stack extends Stack {
  constructor(scope: App, id: string, props?: StackProps) {
    super(scope, id, props);

    const testBucket = Bucket.fromBucketName(this, 'TestBucket', 'dmahapatro-personal-bucket');

    // Create Origin Access Identity to be use Canonical User Id in S3 bucket policy
    const originAccessIdentity = new OriginAccessIdentity(this, 'OAI', {
      comment: "Created_by_dmahapatro"
    });

    // This does not seem to work if Bucket.fromBucketName is used
    // It works for S3 buckets which are created as part of this stack
    // testBucket.grantRead(originAccessIdentity);

    // Explicitly add Bucket Policy 
    const policyStatement = new PolicyStatement();
    policyStatement.addActions('s3:GetBucket*');
    policyStatement.addActions('s3:GetObject*');
    policyStatement.addActions('s3:List*');
    policyStatement.addResources(testBucket.bucketArn);
    policyStatement.addResources(`${testBucket.bucketArn}/*`);
    policyStatement.addCanonicalUserPrincipal(originAccessIdentity.cloudFrontOriginAccessIdentityS3CanonicalUserId);

    // testBucket.addToResourcePolicy(policyStatement);

    // Manually create or update bucket policy
    if( !testBucket.policy ) {
      new BucketPolicy(this, 'Policy', { bucket: testBucket }).document.addStatements(policyStatement);
    } else {
      testBucket.policy.document.addStatements(policyStatement);
    }

    // Create Cloudfront distribution with S3 as Origin
    const distribution = new CloudFrontWebDistribution(this, 'cdk-example-distribution', {
      originConfigs: [
        {
          s3OriginSource: {
            s3BucketSource: testBucket,
            originAccessIdentity: originAccessIdentity
          },
          behaviors: [
            { isDefaultBehavior: true }
          ]
        }
      ]
    });
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过AWS CloudFront从单个S3存储桶为SPA多租户提供服务

来自分类Dev

使用AWS CDK使用S3起源和自定义起源(ELB)配置CloudFront分配

来自分类Dev

如何通过AWS CDK添加S3 BucketPolicy?

来自分类Dev

AWS CDK-SecurityGroup创建打字稿

来自分类Dev

AWS CDK-角色和策略创建

来自分类Dev

AWS CDK Python(未找到凭证)

来自分类Dev

如何使用AWS CDK中的自定义资源将文件上传到S3存储桶

来自分类Dev

AWS S3:关闭“存储桶阻止公共访问”时,拒绝访问对象

来自分类Dev

AWS CDK错误:存储桶策略已存在

来自分类Dev

错误:“条件必须由供应商提供。” 在AWS CDK中创建角色的说明

来自分类Dev

如何从适用于Python的AWS CDK中的存储桶对象获取存储桶名称

来自分类Dev

尝试通过python中的AWS CDK创建预算时出现jsii错误

来自分类Dev

使用aws cdk创建具有s3权限的aws用户

来自分类Dev

访问AWS S3公共存储桶

来自分类Dev

通过cloudformation使用aws`cdk synth`输出

来自分类Dev

是否可以在不提供密钥的情况下访问公共AWS S3存储桶?

来自分类Dev

AWS S3 存储桶策略访问被拒绝

来自分类Dev

如何在AWS CDK中创建侦听器规则?

来自分类Dev

使用CDK创建自定义AWS IAM策略

来自分类Dev

使用AWS CDK创建用于构建Docker映像的CodeBuild项目

来自分类Dev

无法使用python在AWS CDK中写入策略文档

来自分类Dev

通过makeUnauthenticatedRequest进行JS AWS S3公共存储桶访问:“网络故障”?

来自分类Dev

通过makeUnauthenticatedRequest进行JS AWS S3公共存储桶访问:“网络故障”?

来自分类Dev

尝试使用aws-cdk授予s3 Log Delivery Group的完全权限

来自分类Dev

在AWS CDK中请求验证

来自分类Dev

在AWS CDK中请求验证

来自分类Dev

如何将AWS CDK中的``any''传递给存储桶策略

来自分类Dev

AWS CDK:按CDK顺序运行外部构建命令?

来自分类Dev

使用CDK创建AWS EC2实例后如何获得公共DNS?

Related 相关文章

  1. 1

    通过AWS CloudFront从单个S3存储桶为SPA多租户提供服务

  2. 2

    使用AWS CDK使用S3起源和自定义起源(ELB)配置CloudFront分配

  3. 3

    如何通过AWS CDK添加S3 BucketPolicy?

  4. 4

    AWS CDK-SecurityGroup创建打字稿

  5. 5

    AWS CDK-角色和策略创建

  6. 6

    AWS CDK Python(未找到凭证)

  7. 7

    如何使用AWS CDK中的自定义资源将文件上传到S3存储桶

  8. 8

    AWS S3:关闭“存储桶阻止公共访问”时,拒绝访问对象

  9. 9

    AWS CDK错误:存储桶策略已存在

  10. 10

    错误:“条件必须由供应商提供。” 在AWS CDK中创建角色的说明

  11. 11

    如何从适用于Python的AWS CDK中的存储桶对象获取存储桶名称

  12. 12

    尝试通过python中的AWS CDK创建预算时出现jsii错误

  13. 13

    使用aws cdk创建具有s3权限的aws用户

  14. 14

    访问AWS S3公共存储桶

  15. 15

    通过cloudformation使用aws`cdk synth`输出

  16. 16

    是否可以在不提供密钥的情况下访问公共AWS S3存储桶?

  17. 17

    AWS S3 存储桶策略访问被拒绝

  18. 18

    如何在AWS CDK中创建侦听器规则?

  19. 19

    使用CDK创建自定义AWS IAM策略

  20. 20

    使用AWS CDK创建用于构建Docker映像的CodeBuild项目

  21. 21

    无法使用python在AWS CDK中写入策略文档

  22. 22

    通过makeUnauthenticatedRequest进行JS AWS S3公共存储桶访问:“网络故障”?

  23. 23

    通过makeUnauthenticatedRequest进行JS AWS S3公共存储桶访问:“网络故障”?

  24. 24

    尝试使用aws-cdk授予s3 Log Delivery Group的完全权限

  25. 25

    在AWS CDK中请求验证

  26. 26

    在AWS CDK中请求验证

  27. 27

    如何将AWS CDK中的``any''传递给存储桶策略

  28. 28

    AWS CDK:按CDK顺序运行外部构建命令?

  29. 29

    使用CDK创建AWS EC2实例后如何获得公共DNS?

热门标签

归档