gpt4 book ai didi

amazon-web-services - 使用 awscli 更新 cloudfront 配置

转载 作者:行者123 更新时间:2023-12-04 11:51:24 24 4
gpt4 key购买 nike

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

我正在使用最新的 cli 版本:
aws-cli/1.11.56 Python/2.7.10 Darwin/16.4.0 botocore/1.5.19
要在 awscli 中使用 cloudfront 功能,您需要将其添加到 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 的正确方法是什么?

最佳答案

@usterk 的回答是正确的,但我又花了 3 个小时才找到我需要的脚本。在这里,我分享一下。
我的案例:CI/CD 使用 S3/CloudFront 和手动工件版本控制
我在 S3 中托管一个静态网站 (SSG),我希望它由 CloudFront 提供服务。该网站的代码(不仅仅是内容)经常更新,我想将网站的所有版本存储在 S3 中(就像所有工件或 docker 图像一样)并更新 CloudFront 以指向新版本,对吧在新版本推送到 S3 之后。
我知道 S3 中有“文件版本控制”,但这种保留所有版本 Assets 的老式格式有助于分析 Assets 以及轻松回滚。
我的配置

  • 构建 Assets (JS、CSS 等)后,新文件将上传到 S3 的文件夹中,例如 s3://<mybucket-name>/artifacts/<version-id>
  • 在 CloudFront 中,我有一个 经销 www网站。 Route53 为 www.domain.com指向它。
  • 在那经销 我有几个起源 (例如,发送 /api 到 ELB 的路径。)
  • 产地这里的问题是www其中有它的 OriginPath指向 /artifacts/<version-id> .

  • 工作流程
  • 通过 AWS CLI 完成 S3 同步后,我需要 更新 CloudFront 的配置 为该 www Origin 的 OriginPath 值指向 S3 中的新路径。
  • 我还需要发起一个 失效在分发上,因此 CloudFront 在内部(在 S3 和它之间)拾取新文件

  • 任务
    正如@usterk 和@BrianLeishman 指出的,这项工作唯一的 CLI 命令是 update-distribution其中 per the documentation , 需要 完整配置 分布到 更换 它。因此,没有命令可以部分更新配置中的一个字段。
    要实现这一点,必须首先获取当前的 distribution-config,然后提取“DistributionConfig”组件,然后更新它所需要的字段,最后,将其放回正确的格式并使用正确的验证 token 。
    请注意,“更新”命令需要的是“获取”返回的“子集”。所以通过 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 中分配的 Get、Invalidate 和 Update 操作进行 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>
    }
    ]
    }

    关于amazon-web-services - 使用 awscli 更新 cloudfront 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42624579/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com