【问题标题】:Update cloudfront configuration using awscli使用 awscli 更新云端配置
【发布时间】:2017-07-26 06:16:01
【问题描述】:

我想使用 awscli 编辑/更新我的 CloudFront 分配。

我正在使用最新的 cli 版本:

aws-cli/1.11.56 Python/2.7.10 Darwin/16.4.0 botocore/1.5.19

要在 awscli 中使用云端功能,您需要将其添加到您的 aws 配置文件中:

[preview]
cloudfront = true

我正在获取我想要修改的发行版的配置:

aws cloudfront get-distribution-config --id FOO_BAR_ID > cf_config.json

看起来它按预期工作。配置对我来说看起来不错。现在我正在尝试使用相同的配置重新配置我的 CF 发行版。

aws cloudfront update-distribution --distribution-config file://cf_config.json --id FOO_BAR_ID

我得到:

Parameter validation failed:
Missing required parameter in DistributionConfig: "CallerReference"
Missing required parameter in DistributionConfig: "Origins"
Missing required parameter in DistributionConfig: "DefaultCacheBehavior"
Missing required parameter in DistributionConfig: "Comment"
Missing required parameter in DistributionConfig: "Enabled"
Unknown parameter in DistributionConfig: "ETag", must be one of: CallerReference, Aliases, DefaultRootObject, Origins, DefaultCacheBehavior, CacheBehaviors, CustomErrorResponses, Comment, Logging, PriceClass, Enabled, ViewerCertificate, Restrictions, WebACLId, HttpVersion, IsIPV6Enabled
Unknown parameter in DistributionConfig: "DistributionConfig", must be one of: CallerReference, Aliases, DefaultRootObject, Origins, DefaultCacheBehavior, CacheBehaviors, CustomErrorResponses, Comment, Logging, PriceClass, Enabled, ViewerCertificate, Restrictions, WebACLId, HttpVersion, IsIPV6Enabled

使用 awscli 重新配置 CF 的正确方法是什么?

【问题讨论】:

    标签: amazon-web-services amazon-cloudfront aws-cli


    【解决方案1】:

    @usterk 的回答是正确的,但我又花了 3 个小时才找到我需要的脚本。在这里,我分享一下。

    我的案例:CI/CD 使用 S3/CloudFront 和手动工件版本控制

    我在 S3 中托管一个静态网站 (SSG),我希望它由 CloudFront 提供服务。该网站在其代码(不仅仅是内容)方面经常更新,我想将网站的所有版本存储在 S3 中(就像所有工件或 docker 图像一样)并更新 CloudFront 以指向新版本,对吧新版本推送到 S3 后。

    我知道 S3 中有“文件版本控制”,但这种保留所有资产版本的老式格式有助于分析资产以及轻松回滚。

    我的配置

    • 在构建资产(JS、CSS 等)后,新文件将上传到 S3 的 s3://<mybucket-name>/artifacts/<version-id> 等文件夹中
    • 在 CloudFront 中,我有一个www 网站的分发版www.domain.com 的 Route53 指向它。
    • 在那个 Distribution 中,我有几个 Origins(例如,一个发送 /api 到 ELB 的路径。)
    • 这里重要的Originwww,它的OriginPath指向/artifacts/<version-id>

    工作流程

    • 通过 AWS CLI 完成 S3 同步后,我需要更新 CloudFront 的配置,以使 www Origin 的 OriginPath 值指向 S3 中的新路径。
    • 我还需要在分配上启动失效,以便 CloudFront 在内部(在 S3 和它之间)获取新文件

    任务

    正如@usterk 和@BrianLeishman 指出的那样,该作业的唯一CLI 命令是update-distribution,其中per the documentation 需要分发的ENTIRE CONFIGURATIONREPLACE 它。因此,没有命令可以仅部分更新配置中的一个字段。

    要实现这一点,必须首先获取当前的分发配置,然后提取“分发配置”组件,然后更新它需要的字段,最后,使用适当的验证令牌将其放回适当的格式。

    请注意,“更新”命令需要的是“获取”返回的“子集”。所以通过jq解析JSON是必然的。

    Bash 脚本

    我想出的以下脚本为我完成了这项工作:

    # 0) You need to set the followings for your case
    CLOUDFRONT_DISTRIBUTION_ID="EABCDEF12345ABCD"
    NEW_ORIGIN_PATH="/art/0.0.9"
    CLOUDFRONT_ORIGIN_ID="E1A2B3C4D5E6F"
    
    DIST_CONFIG_OLD_FILENAME="dist-config.json" # a temp file, which will be removed later
    DIST_CONFIG_NEW_FILENAME="dist-config2.json" # a temp file, which will be removed later
    
    # 1) Get the current config, entirely, and put it in a file
    aws cloudfront get-distribution --id $CLOUDFRONT_DISTRIBUTION_ID > $DIST_CONFIG_OLD_FILENAME
    
    # 2) Extract the Etag which we need this later for update
    Etag=`cat $DIST_CONFIG_OLD_FILENAME | jq '.ETag' | tr -d \"`
    
    # 3) Modify the config as wished, for me I used `jq` extensively to update the "OriginPath" of the desired "originId"
    cat $DIST_CONFIG_OLD_FILENAME | jq \
        --arg targetOriginId $CLOUDFRONT_ORIGIN_ID \
        --arg newOriginPath $NEW_ORIGIN_PATH \
        '.Distribution.DistributionConfig | .Origins.Items = (.Origins.Items | map(if (.Id == $targetOriginId) then (.OriginPath = $newOriginPath) else . end))' \
        > $DIST_CONFIG_NEW_FILENAME
    
    # 4) Update the distribution with the new file
    aws cloudfront update-distribution --id $CLOUDFRONT_DISTRIBUTION_ID \
        --distribution-config "file://${DIST_CONFIG_NEW_FILENAME}" \
        --if-match $Etag \
        > /dev/null
    
    # 5) Invalidate the distribution to pick up the changes
    aws cloudfront create-invalidation --distribution-id $CLOUDFRONT_DISTRIBUTION_ID --paths "/*"
    
    # 6) Clean up
    rm -f $DIST_CONFIG_OLD_FILENAME $DIST_CONFIG_NEW_FILENAME
    
    

    最后说明:IAM 访问权限

    执行这些操作的用户需要对 CloudFront 中分配的获取、无效和更新操作的 IAM 访问权限。以下是提供这一点的政策:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "cloudfront:GetDistribution",
                    "cloudfront:UpdateDistribution",
                    "cloudfront:CreateInvalidation"
                ],
                "Resource": "arn:aws:cloudfront::<ACCOUNT_ID>:distribution/<DISTRIBUTION_ID>
            }
        ]
    }
    

    【讨论】:

    • 愿上帝保佑你的灵魂,如果你相信天堂,我希望你能到达那里!
    【解决方案2】:

    您必须先编辑 cf_config.json 才能将其与 update-distribution 一起使用并删除

    {
        "ETag": "ETag_Value",
        "DistributionConfig":
    

    从文件的开头到最后

    }
    

    从文件末尾开始。

    然后将此命令与从cf_config.json 中删除的正确idETag 值一起使用

    aws cloudfront update-distribution --distribution-config file://cf_config.json --id FOO_BAR_ID --if-match ETag_Value
    

    【讨论】:

    • 嗨,有没有办法在一个 bash 脚本中完成所有这些操作?
    • @KeshavKumaresan,如果你安装 jq apt install jq,那么你可以像这样/root/.local/bin/aws cloudfront get-distribution-config --id &lt;Your CloudFront ID&gt; | jq .DistributionConfig 得到请求的正文
    • 你好,你能把你cf_config.json的内容给我看看
    • @KeshavKumaresan 阅读了我上面的答案以获取完整的 bash 脚本:stackoverflow.com/a/66960593
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多