如何使用Terraform从GitHub Enterprise下载文件?

Hap*_*ppy 8 amazon-s3 terraform

这是我的s3_policy.json

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"mybucket",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":[
        "arn:aws:s3:::${bucket_name}/*"
      ],
      "Condition": {
          "IpAddress": {
              "aws:SourceIp": [
              "10.xx.xxx.x",
              "172.168.xx.x",
              ........,
              .........,
              ..........,
              ...........,
              ]
          }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我有一个共同的回购,我用它来做不同的项目.这个通用仓库有一个yaml格式的CIDR IP列表.

我想将它拉入我的Terraform项目,以便我可以重新使用相同的文件而不是硬编码IP地址.

我无法找到一种自动化方法,而不是在此repo中硬编码IP地址.

yda*_*coR 4

您可以将 IP 地址用作数据源并使用它。

您的保单文件将如下所示:

resource "aws_iam_policy" "whitelist_ips" {
  name        = "whitelist_ips"
  description = "${var.policy_description}"

  policy = <<EOF
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"mybucket",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":[
        "arn:aws:s3:::${bucket_name}/*"
      ],
      "Condition": {
          "IpAddress": {
              "aws:SourceIp": ["${data.external.ip_addresses.result}"]
          }
      }
    }
  ]
}
EOF
}
Run Code Online (Sandbox Code Playgroud)

您需要创建一个可以运行的外部数据源,该数据源将从某个位置获取 IP 地址并将 IP 作为逗号分隔的字符串返回。

data "external" "ip_addresses" {
  program = ["python", "${path.module}/get_ips.py"]
}
Run Code Online (Sandbox Code Playgroud)

哪里get_ips.py可能看起来像这样:

#!/usr/bin/env python
from __future__ import print_function
import json
import re

yaml_string = """ - 1.2.3.4/32
 - 1.2.3.5/32
 - 1.3.0.0/16
"""

result = []
lines = yaml_string.split("\n")

for line in lines:
    # Remove empty lines
    if line != "":
        result.append(re.sub('\s*-\s*', '', line))

print(json.dumps(','.join(result)))
Run Code Online (Sandbox Code Playgroud)

但显然您需要从 Github 获取 YAML 列表,而不是毫无意义地将其硬编码到该数据源中。