【问题标题】:Deploying static site with s3 and cloudfront using python boto3使用 python boto3 使用 s3 和 cloudfront 部署静态站点
【发布时间】:2017-06-24 20:30:19
【问题描述】:

尝试使用 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)
            )
)

当我尝试创建云端分发时,我收到以下错误:

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')

【问题讨论】:

  • hmmm... mydomain.com 不应该是存储桶名称吗?不认为存储桶名称中允许使用点...?
  • 点和破折号是允许的。我确实尝试了一个没有“。”的存储桶名称。字符虽然,我得到了同样的错误。从字面上看,在 aws Web 控制台中使用相同的 Origin Domain Name 字符串是可行的。
  • 它存在吗?我的意思是..您使用的域实际上有效吗?
  • 打开一些调试或任何必要的东西来捕获生成的请求正文 XML? InvalidOrigin 错误似乎意味着以下情况之一:没有这样的存储桶、存储桶名称 > 63 个字符、存储桶名称中的大写字符、存储桶名称中的相邻点、存储桶名称中的无效字符或未指定 .s3.amazonaws.com 的存储桶主机名添加到末尾。
  • @gsaslis 是的,存储桶存在。我可以在 Web 控制台中为它进行有效的分发。等待亚马逊支持的回复

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


【解决方案1】:

原来它们是未正确记录的必需参数。

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

以下命令有效。请注意,您仍然需要一个存储桶策略来使对象可访问,以及一个 route53 条目来将我们想要的 cname 别名为 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',
                    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)
            )
)

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 2018-08-05
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2020-08-25
    • 2017-05-14
    相关资源
    最近更新 更多