Skip to content
This repository was archived by the owner on Sep 9, 2022. It is now read-only.

Commit 3269925

Browse files
committed
add iam_role_policy_attachment
1 parent 518879d commit 3269925

File tree

6 files changed

+182
-0
lines changed

6 files changed

+182
-0
lines changed

lib/terraforming.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
require "terraforming/resource/iam_policy_attachment"
4646
require "terraforming/resource/iam_role"
4747
require "terraforming/resource/iam_role_policy"
48+
require "terraforming/resource/iam_role_policy_attachment"
4849
require "terraforming/resource/iam_user"
4950
require "terraforming/resource/iam_user_policy"
5051
require "terraforming/resource/kms_alias"

lib/terraforming/cli.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ def iamrp
115115
execute(Terraforming::Resource::IAMRolePolicy, options)
116116
end
117117

118+
desc "iamrpa", "IAM Role Policy Attachment"
119+
def iamrpa
120+
execute(Terraforming::Resource::IAMRolePolicyAttachment, options)
121+
end
122+
118123
desc "iamu", "IAM User"
119124
def iamu
120125
execute(Terraforming::Resource::IAMUser, options)
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
module Terraforming
2+
module Resource
3+
class IAMRolePolicyAttachment
4+
include Terraforming::Util
5+
6+
def self.tf(client: Aws::IAM::Client.new)
7+
self.new(client).tf
8+
end
9+
10+
def self.tfstate(client: Aws::IAM::Client.new)
11+
self.new(client).tfstate
12+
end
13+
14+
def initialize(client)
15+
@client = client
16+
end
17+
18+
def tf
19+
apply_template(@client, "tf/iam_role_policy_attachment")
20+
end
21+
22+
def tfstate
23+
iam_role_policy_attachments.inject({}) do |resources, role_policy_attachment|
24+
attributes = {
25+
"id" => role_policy_attachment[:name],
26+
"policy_arn" => role_policy_attachment[:policy_arn],
27+
"role" => role_policy_attachment[:role]
28+
}
29+
resources["aws_iam_role_policy_attachment.#{module_name_of(role_policy_attachment)}"] = {
30+
"type" => "aws_iam_role_policy_attachment",
31+
"primary" => {
32+
"id" => role_policy_attachment[:name],
33+
"attributes" => attributes
34+
}
35+
}
36+
37+
resources
38+
end
39+
end
40+
41+
private
42+
43+
def attachment_name_from(role, policy)
44+
"#{role.role_name}-#{policy.policy_name}-attachment"
45+
end
46+
47+
def iam_roles
48+
@client.list_roles.map(&:roles).flatten
49+
end
50+
51+
def policies_attached_to(role)
52+
@client.list_attached_role_policies(role_name: role.role_name).attached_policies
53+
end
54+
55+
def iam_role_policy_attachments
56+
iam_roles.map do |role|
57+
policies_attached_to(role).map do |policy|
58+
{
59+
role: role.role_name,
60+
policy_arn: policy.policy_arn,
61+
name: attachment_name_from(role, policy)
62+
}
63+
end
64+
end.flatten
65+
end
66+
67+
def module_name_of(role_policy_attachment)
68+
normalize_module_name(role_policy_attachment[:name])
69+
end
70+
end
71+
end
72+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<% iam_role_policy_attachments.each do |role_policy_attachment| -%>
2+
resource "aws_iam_role_policy_attachment" "<%= module_name_of(role_policy_attachment) %>" {
3+
policy_arn = "<%= role_policy_attachment[:policy_arn] %>"
4+
role = "<%= role_policy_attachment[:role] %>"
5+
}
6+
7+
<% end -%>

spec/lib/terraforming/cli_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,13 @@ module Terraforming
190190
it_behaves_like "CLI examples"
191191
end
192192

193+
describe "iamrpa" do
194+
let(:klass) { Terraforming::Resource::IAMRolePolicyAttachment }
195+
let(:command) { :iamrpa }
196+
197+
it_behaves_like "CLI examples"
198+
end
199+
193200
describe "iamu" do
194201
let(:klass) { Terraforming::Resource::IAMUser }
195202
let(:command) { :iamu }
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
require "spec_helper"
2+
3+
module Terraforming
4+
module Resource
5+
describe IAMRolePolicyAttachment do
6+
let(:client) do
7+
Aws::IAM::Client.new(stub_responses: true)
8+
end
9+
10+
let(:roles) do
11+
[
12+
{
13+
path: "/",
14+
role_name: "hoge_role",
15+
role_id: "ABCDEFGHIJKLMN1234567",
16+
arn: "arn:aws:iam::123456789012:role/hoge_role",
17+
create_date: Time.parse("2015-04-01 12:34:56 UTC"),
18+
assume_role_policy_document: "%7B%22Version%22%3A%222008-10-17%22%2C%22Statement%22%3A%5B%7B%22Sid%22%3A%22%22%2C%22Effect%22%3A%22Allow%22%2C%22Principal%22%3A%7B%22Service%22%3A%22ec2.amazonaws.com%22%7D%2C%22Action%22%3A%22sts%3AAssumeRole%22%7D%5D%7D"
19+
},
20+
]
21+
end
22+
23+
let(:list_attached_role_policies_hoge) do
24+
{
25+
attached_policies: [
26+
{
27+
policy_name: "hoge_policy",
28+
policy_arn: "arn:aws:iam::123456789012:policy/hoge-policy"
29+
},
30+
{
31+
policy_name: "fuga_policy",
32+
policy_arn: "arn:aws:iam::345678901234:policy/fuga-policy"
33+
}
34+
]
35+
}
36+
end
37+
38+
before do
39+
client.stub_responses(:list_roles, roles: roles)
40+
client.stub_responses(:list_attached_role_policies, list_attached_role_policies_hoge)
41+
end
42+
43+
describe ".tf" do
44+
it "should generate tf" do
45+
expect(described_class.tf(client: client)).to eq <<~EOS
46+
resource "aws_iam_role_policy_attachment" "hoge_role-hoge_policy-attachment" {
47+
policy_arn = "arn:aws:iam::123456789012:policy/hoge-policy"
48+
role = "hoge_role"
49+
}
50+
51+
resource "aws_iam_role_policy_attachment" "hoge_role-fuga_policy-attachment" {
52+
policy_arn = "arn:aws:iam::345678901234:policy/fuga-policy"
53+
role = "hoge_role"
54+
}
55+
56+
EOS
57+
end
58+
end
59+
60+
describe ".tfstate" do
61+
it "should generate tfstate" do
62+
expect(described_class.tfstate(client: client)).to eq({
63+
"aws_iam_role_policy_attachment.hoge_role-hoge_policy-attachment" => {
64+
"type" => "aws_iam_role_policy_attachment",
65+
"primary" => {
66+
"id" => "hoge_role-hoge_policy-attachment",
67+
"attributes" => {
68+
"id" => "hoge_role-hoge_policy-attachment",
69+
"policy_arn" => "arn:aws:iam::123456789012:policy/hoge-policy",
70+
"role" => "hoge_role"
71+
}
72+
}
73+
},
74+
"aws_iam_role_policy_attachment.hoge_role-fuga_policy-attachment" => {
75+
"type" => "aws_iam_role_policy_attachment",
76+
"primary" => {
77+
"id" => "hoge_role-fuga_policy-attachment",
78+
"attributes" => {
79+
"id" => "hoge_role-fuga_policy-attachment",
80+
"policy_arn" => "arn:aws:iam::345678901234:policy/fuga-policy",
81+
"role" => "hoge_role"
82+
}
83+
}
84+
}
85+
})
86+
end
87+
end
88+
end
89+
end
90+
end

0 commit comments

Comments
 (0)