【问题标题】:Creating Route53 Record Sets via Shell Script通过 Shell 脚本创建 Route53 记录集
【发布时间】:2018-08-20 01:49:18
【问题描述】:

作为我的 shell 脚本的一部分,我正在尝试在 AWS Route53 中创建记录集。但是,在我的 shell 脚本中使用 aws cli 中的变量来创建这些记录集,我在 shell 脚本中导出的变量不会被传递给 aws cli 命令

AWS 提供的 AWS CLI 命令:

$ aws route53 change-resource-record-sets --hosted-zone-id 1234567890ABC \
  --change-batch file:///path/to/record.json

为了简单起见,我不想在我的计算机上创建一个单独的 json 文件,我希望我的所有命令和变量都包含在 shell 脚本中。

#!/bin/bash

export TARGET_ENVIRONMENT=uat 
export BASE_ENVIRONMENT_DNS=abcd-External-9982627718-1916763929.us-west-1.elb.amazonaws.com

# Creates route 53 records based on env name

aws route53 change-resource-record-sets --hosted-zone-id 1234567890ABC  
--change-batch '{ "Comment": "Testing creating a record set", 
"Changes": [ { "Action": "CREATE", "ResourceRecordSet": { "Name": 
"$(TARGET_ENVIRONMENT).company.com", "Type": "CNAME", "TTL": 
120, "ResourceRecords": [ { "Value": "$(BASE_ENVIRONMENT_DNS)" } ] } } ] }'

最后一条命令在 AWS Route53 上创建一个记录集:

$(TARGET_ENVIRONMENT).company.com

以 CNAME 为

$(BASE_ENVIRONMENT_DNS)

不是 真的如我所愿,即:

uat.company.com

使用 CNAME:

abcd-External-9982627718-1916763929.us-west-1.elb.amazonaws.com

如何在脚本中将环境变量传递给我的 aws cli 命令?

我们将不胜感激。

谢谢!

【问题讨论】:

    标签: shell amazon-web-services aws-cli amazon-route53 recordset


    【解决方案1】:

    变量不在单引号内展开。

    如果您在变量展开之前关闭单引号,然后立即再次打开它们,应该会产生预期的效果。您可能需要也可能不需要将变量用双引号括起来以使其展开。

    #!/bin/bash
    
    ENV=uat 
    DNS=abcd-External-9982627718-1916763929.us-west-1.elb.amazonaws.com
    
    # Creates route 53 records based on env name
    
    aws route53 change-resource-record-sets \
      --hosted-zone-id 1234567890ABC \
      --change-batch '
      {
        "Comment": "Testing creating a record set"
        ,"Changes": [{
          "Action"              : "CREATE"
          ,"ResourceRecordSet"  : {
            "Name"              : "'" $ENV "'.company.com"
            ,"Type"             : "CNAME"
            ,"TTL"              : 120
            ,"ResourceRecords"  : [{
                "Value"         : "'" $DNS "'"
            }]
          }
        }]
      }
      '
    

    【讨论】:

    • 对于那些可能会摸不着头脑试图理解为什么会这样的人来说,shell 不需要为相邻的带引号的文字使用连接运算符(使用双引号时会扩展)。 echo 'a'"b"'c' 说明了这一点。 (结果:abc 之间没有空格。)
    • 谢谢@nicholas.hauschild,这很有效。感谢您的帮助。
    • 我讨厌这行得通。但我也很高兴。
    【解决方案2】:

    您还可以利用 process substitution 来保持 JSON 格式:

    #!/bin/bash
    
    export TARGET_ENVIRONMENT=uat 
    export BASE_ENVIRONMENT_DNS=abcd-External-9982627718-1916763929.us-west-1.elb.amazonaws.com
    
    # Creates route 53 records based on env name
    
    aws route53 change-resource-record-sets --hosted-zone-id 1234567890ABC --change-batch file://<(cat << EOF
    {
      "Comment": "Testing creating a record set",
      "Changes": [
        {
          "Action": "CREATE",
          "ResourceRecordSet": {
            "Name": "$(TARGET_ENVIRONMENT).company.com",
            "Type": "CNAME",
            "TTL": 120,
            "ResourceRecords": [
              {
                "Value": "$(BASE_ENVIRONMENT_DNS)"
              }
            ]
          }
        }
      ]
    }
    EOF
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-04
      • 2013-06-03
      • 2015-10-13
      • 2014-02-01
      • 2015-01-08
      • 2018-01-08
      • 1970-01-01
      • 2017-07-12
      相关资源
      最近更新 更多