使用python boto3使用s3和cloudfront部署静态站点

时间:2017-02-07 14:35:37

标签: python amazon-web-services amazon-s3 amazon-cloudfront boto3

尝试使用boto3自动部署静态网站。我有一个静态网站(angular / javascript / html)坐在一个桶里,需要使用aws cloudfront CDN。

无论如何,看起来像制作s3存储桶并在html / js中复制工作正常。

import boto3
cf = boto3.client('cloudfront')

cf.create_distribution(DistributionConfig=dict(CallerReference='firstOne',
            Aliases = dict(Quantity=1, Items=['mydomain.com']),
            DefaultRootObject='index.html',
            Comment='Test distribution',
            Enabled=True,
            Origins = dict(
                Quantity = 1, 
                Items = [dict(
                    Id = '1',
                    DomainName='mydomain.com.s3.amazonaws.com')
                ]),
            DefaultCacheBehavior = dict(
                TargetOriginId = '1',
                ViewerProtocolPolicy= 'redirect-to-https',
                TrustedSigners = dict(Quantity=0, Enabled=False),
                ForwardedValues=dict(
                    Cookies = {'Forward':'all'},
                    Headers = dict(Quantity=0),
                    QueryString=False,
                    QueryStringCacheKeys= dict(Quantity=0),
                    ),
                MinTTL=1000)
            )
)

当我尝试创建cloudfront发行版时,出现以下错误:

  

InvalidOrigin:调用CreateDistribution操作时发生错误(InvalidOrigin):指定的源服务器不存在或无效。   调用CreateDistribution操作时发生错误(InvalidOrigin):指定的源服务器不存在或无效。

有趣的是,它看起来是抱怨来源mydomain.com.s3.amazonaws.com,但是当我在Web控制台中为s3存储桶创建一个发行版时,它对于相同的原始域名没有任何问题。

更新: 我可以使用以下内容与boto一起使用,但宁可使用boto3:

import boto
c = boto.connect_cloudfront()
origin = boto.cloudfront.origin.S3Origin('mydomain.com.s3.amazonaws.com')
distro = c.create_distribution(origin=origin, enabled=False, comment='My new Distribution')

1 个答案:

答案 0 :(得分:2)

原来他们是一个未正确记录的必需参数。

由于Origin是S3存储桶,即使未使用OriginAccessIdentity,也必须定义S3OriginConfig = dict(OriginAccessIdentity =''),并且是空字符串。

以下命令有效。注意,您仍然需要一个存储桶策略来使对象可访问,并且还需要一个route53条目来为我们想要的云端生成的主机名命名别名。

cf.create_distribution(DistributionConfig=dict(CallerReference='firstOne',
            Aliases = dict(Quantity=1, Items=['mydomain.com']),
            DefaultRootObject='index.html',
            Comment='Test distribution',
            Enabled=True,
            Origins = dict(
                Quantity = 1, 
                Items = [dict(
                    Id = '1',
                    DomainName='mydomain.com.s3.amazonaws.com',
                    S3OriginConfig = dict(OriginAccessIdentity = ''))
                ]),
            DefaultCacheBehavior = dict(
                TargetOriginId = '1',
                ViewerProtocolPolicy= 'redirect-to-https',
                TrustedSigners = dict(Quantity=0, Enabled=False),
                ForwardedValues=dict(
                    Cookies = {'Forward':'all'},
                    Headers = dict(Quantity=0),
                    QueryString=False,
                    QueryStringCacheKeys= dict(Quantity=0),
                    ),
                MinTTL=1000)
            )
)