2017-07-26 13 views
8

Đây là s3_policy.json tôiCách tải xuống tệp từ GitHub Enterprise bằng Terraform?

{ 
    "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", 
       ........, 
       ........., 
       .........., 
       ..........., 
       ] 
      } 
     } 
    } 
    ] 
} 

Tôi có repo chung mà tôi sử dụng nó cho các dự án khác nhau. Repo phổ biến này có một danh sách IP CIDR ở định dạng yaml.

Tôi muốn kéo nó vào dự án Terraform của mình để tôi có thể sử dụng cùng một tệp thay vì địa chỉ IP mã hóa.

Tôi không thể tìm ra cách để tự động hóa điều này thay vì địa chỉ IP mã hóa trong repo này.

Trả lời

2

Bạn có thể sử dụng địa chỉ IP làm nguồn dữ liệu và sử dụng thay vào đó.

tài liệu chính sách của bạn sau đó sẽ như thế nào:

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 
} 

Bạn sẽ cần phải tạo một external data source có thể chạy mà sẽ lấy địa chỉ IP từ một số vị trí và trả lại IP như là một chuỗi dấu phẩy tách ra.

data "external" "ip_addresses" { 
    program = ["python", "${path.module}/get_ips.py"] 
} 

nơi get_ips.py có thể trông như thế này:

#!/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))) 

Nhưng rõ ràng là bạn cần phải đi lấy danh sách YAML từ Github thay vì pointlessly hardcoding nó trong nguồn dữ liệu này.

Các vấn đề liên quan