2017-07-26 29 views
8

は、ここに私のs3_policy.jsonTerraformを使ってGitHub Enterpriseからファイルをダウンロードする方法は?

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

私は別のプロジェクトのためにそれを使用する一般的なレポを持っています。この共通リポジトリには、yaml形式のCIDR IPリストがあります。

私は、IPアドレスをハードコードするのではなく、同じファイルを再利用できるように、私のTerraformプロジェクトに取り込みたいと思います。

このレポでIPアドレスをハードコードする代わりに、自動化する方法を見つけられません。

答えて

2

IPアドレスをデータソースとして消費し、代わりに使用することができます。

あなたの政策文書は、次のようになります。あなたはいくつかの場所からIPアドレスを取得し、カンマ区切りの文字列としてIPアドレスを返すよう実行することができexternal data sourceを作成する必要があります

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 
} 

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

しかし、明らかにあなたの代わりに無意味にこのデータソースでそれをハードコーディングのGithubからYAMLのリストを取得移動する必要があります:。get_ips.pyはこのようになります

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

関連する問題