amazon-web-services - 使用 Cloudformation 和 Pystache 派生 IP 范围和网络掩码

标签 amazon-web-services aws-cloudformation mustache openvpn pystache

所以,我有一个有趣的 - Cloudformation 允许使用 Mustache 模板(通过 Pystache)通过 AWS::CloudFormation::Init 构建配置文件(他们将其隐藏了几段,但它就在那里)。

这对我很有用,因为我需要写出一些网络详细信息来为 OpenVPN 服务器创建配置文件。到目前为止,一切顺利。

但这就是棘手的地方 - AWS 喜欢 CIDR 表示法(并且我需要对 AWS 资源和此使用相同的参数)。但 OpenVPN 喜欢使用较旧的 IP 范围和网络掩码格式。我目前正在尝试找到一种转换此内容的好方法。我可以使用 CloudFormation 函数,也可以尝试找到一种在 Mustache 中进行转换的方法。

我可以使用 Fn::Select 和 Fn::Split 的组合来提取 CIDR 的前半部分来获取 IP 范围,但目前导出网络掩码让我感到困惑。

到目前为止的示例

          "/etc/openvpn/server/configname.conf" : {
            "source" : {"Fn::Sub" : 
               [ "https://${ConfigBucket}.s3.amazonaws.com/Path/To/configname.conf.mustache"
               , { "ConfigBucket" : { "Fn::ImportValue" : "ConfigBucket-Export-Name" }} ]
            },
            "context" : {
              "VpnCIDR" : { "Ref" : "VpnCIDRRange"},
              "VpnIPRange" : { "Fn::Select" : [ "0", {"Fn::Split" : ["/", { "Ref" : "VpnCIDRRange"}]}]},
              "AwsCIDR" : { "Fn::ImportValue" : { "Fn::Sub" : "${VPCName}-VPC-CIDR" } },
              "AwsIPRange" : { "Fn::Select" : [ "0", {"Fn::Split" : ["/", { "Fn::ImportValue" : { "Fn::Sub" : "${VPCName}-VPC-CIDR" }}]}]}
            }
          } 

最佳答案

好的,所以我最终使用一个简单的 CloudFormation 宏来解决这个问题,该宏采用 CIDR 范围并返回包含 CIDR、子网和网络掩码的 JSON 对象 - 例如,给定 192.168.1.0/24,它将返回以下 JSON用于包含在 CloudFormation 模板中的片段

{
  'CIDR' : '192.168.1.0/24',
  'subnet' : '192.168.1.0',
  'netmask' : '255.255.255.0'
}

有问题的代码已发布到此要点:https://gist.github.com/AdamLuchjenbroers/3165ab18bb0ee9da95ad6bf514f415e0

它还可以采用堆栈导出的名称(这是必需的,因为显然 Fn::ImportValue 在 Fn::Transform 之后进行评估)以启用堆栈之间的串扰。

然后可以通过 CloudFormation::Init 中的上下文键传递该值文件部分如下所示:

"/etc/openvpn/server/openvpn.conf" : {
    "source": {
      "Fn::Sub": [
        "https://${BucketName}.s3.${Region}.amazonaws.com/Path/To/openvpn.conf.mustache",
        {
          "BucketName": "BucketNameGoesHere",
          "Region": { "Ref": "AWS::Region" }
        }
      ]
    },
    "context": {
      "Vpn": {
        "Fn::Transform": {
          "Name": "NetworkInfo",
          "Parameters": {
            "CIDR": { "Ref": "VpnCIDRRange"    }
          }
        }
      },
      "Aws": {
        "Fn::Transform": {
          "Name": "NetworkInfo",
          "Parameters": {
            "CIDR-export": { "Fn::Sub": "${VPCName}-VPC-CIDR" }
          }
        }
      }
    }
  },

然后在实际的 mustache 模板中引用,如下所示:

push "route {{Aws.subnet}} {{Aws.netmask}}"

关于amazon-web-services - 使用 Cloudformation 和 Pystache 派生 IP 范围和网络掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67138269/

相关文章:

amazon-web-services - nosql/dynamodb 哈希和范围用例

ruby-on-rails - 操作系统 : Rails Layer connect to Elasticache : Redis

yaml - AWS::Serverless::Function 策略中的 AWS Cloud Formation !Sub 和 !Ref 函数

aws-cloudformation - 如何将多个预先存在的 AWS 托管角色附加到策略?

jquery - Mustache.js - 显示键而不是值

amazon-web-services - Jenkins 拒绝 S3 存储桶访问

amazon-web-services - 运行 Amplify Auth Update 后运行 Amplify Push 时出错

amazon-web-services - Cloudformation 更新堆栈名称或环境的堆栈策略条件

javascript - 在 Mustache JS 中生成按钮时,单击事件/绑定(bind)事件在 jQuery 中不起作用

javascript - Web 应用程序的数据驱动表单