2017-12-15 9 views
0

バケットを作成してから、リストされたすべてのアカウントにアクセスできるようにするバケットポリシーを作成しています。 terraform plan/applyを渡すと思われますが、コンソールを見ると、アカウントが1つしかリストされていないため、以前のポリシーを踏みにじっているようです。複数のプリンシパルを持つ単一のバケットポリシーを作成するためのリストの反復

私はバケツ/ポリシーを生成するための変数リストとコードを持っている:

variable "accounts" { 
    type = "list" 
    default = [ 
     "111111111111", 
     "222222222222", 
     "333333333333", 
     "444444444444", 
     "555555555555", 
     "666666666666", 
     "777777777777" 
    ] 
} 


resource "aws_s3_bucket" "my_bucket" { 
    bucket = "${var.bucket_name}" 
} 
resource "aws_s3_bucket_policy" "my_bucket_policy" { 
    bucket = "${aws_s3_bucket.my_bucket.id}" 
    count = "${length(var.accounts)}" 
    policy =<<EOF 
{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::${element(var.accounts, count.index)}:root" 
      }, 
      "Action": "s3:PutObject", 
      "Resource": "arn:aws:s3:::${var.bucket_name}/CloudTrail/AWSLogs/${element(var.accounts, count.index)}/*" 
     } 
    ] 
} 
EOF 
} 

はただ唯一のリソースや校長のセクションで変数リストを反復処理する方法はありますか?目標は、変数からすべての値を持つ単一のバケットポリシーを生成することです。

+0

現在、このケースでは、各アカウントのルールを作成するためのforループはありません。 – BMW

答えて

0

各バケットは1つのバケットポリシーのみをサポートしているため、複数のバケットポリシーを作成することはできません。

代わりに、アカウントごとに1つずつ、1つのポリシー内に複数のステートメントを作成できます。 Terraformは反復をサポートしていませんが、formatlist()join(の関数を使用して同じ効果を得ることができます。この場合

resource "aws_s3_bucket_policy" "my_bucket_policy" { 
    bucket = "${aws_s3_bucket.my_bucket.id}" 
    policy =<<EOF 
{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     ${join(",\n",formatlist(" 
     { 
      \"Effect\": \"Allow\", 
      \"Principal\": { 
       \"AWS\": \"arn:aws:iam::%s:root\" 
      }, 
      \"Action\": \"s3:PutObject\", 
      \"Resource\": \"arn:aws:s3:::%s/CloudTrail/AWSLogs/%s/*\" 
     } 
     ", var.accounts, var.bucket_name, var.accounts))} 
    ] 
} 
EOF 
} 

、私はformatlist()関数の最初の引数として、文全体の内容を置きます。二重引用符をエスケープする必要がありましたが、Terraformでは改行をエスケープする必要はありません。それは、置換を入れたい%sを含んでいます。他のformatlist()引数が置き換えられます。

formatlist()の出力はリストなので、join()関数を使用してリストを1つの出力文字列に結合する必要がありました。 join()関数では、各文の間にカンマ区切り記号を追加することもできました。

関連する問題