Trong các tài liệu cho aws_iam_user_policy
tại thời điểm trả lời này, ví dụ sử dụng chính hiển thị cài đặt chính sách
như thế này:
# Chức năng "jsonencode" của Terraform chuyển đổi một
# Biểu thức Terraform dẫn đến cú pháp JSON hợp lệ.
chính sách = jsonencode({
Phiên bản = "2012-10-17"
Tuyên bố = [
{
Hành động = [
"ec2:Mô tả*",
]
Hiệu ứng = "Cho phép"
Tài nguyên = "*"
},
]
})
Lưu ý rằng nó khuyến nghị sử dụng các jsonencode
chức năng để tạo ra toàn bộ giá trị, thay vì cố gắng tạo JSON từ các phần thông qua nối mẫu, vì điều đó đảm bảo rằng kết quả sẽ luôn là cú pháp JSON hợp lệ.
Nó Mà còn có lợi ích mà bạn có thể sử dụng bất kỳ biểu thức bạn cần đưa ra quyết định động về cấu trúc dữ liệu.Trong trường hợp của bạn, bạn đã có một tham chiếu động đến địa chỉ email của người dùng từ một biến, vì vậy, hãy bắt đầu bằng cách dịch những gì bạn có thành một biểu mẫu giống như ví dụ trong tài liệu:
chính sách = jsonencode({
Phiên bản = 2012-10-17"
Tuyên bố = [
{
Hiệu ứng = "Cho phép"
Hành động = [
"ses:Gửi Email",
"ses:SendRawEmail",
]
Tài nguyên = "*"
Điều kiện = {
StringEquals = {
"ses:FromAddress" = [
var.user_email_address,
]
}
}
}
]
})
Lưu ý rằng giá trị hiện được viết theo cú pháp biểu thức riêng của Terraform, thay vì cú pháp JSON. Terraform sẽ tự xây dựng cú pháp JSON hợp lệ như một phần của việc đánh giá jsonencode
lời gọi hàm.
Yêu cầu mới của bạn là bỏ qua Điều kiện, tình trạng, trạng thái
hoàn toàn trong một số trường hợp nhất định. Để mô tả yêu cầu đó dưới dạng biểu thức Terraform yêu cầu hợp nhất đối tượng mô tả các phần luôn hiện diện (Hiệu ứng
, Hoạt động
, và Nguồn
) với một biểu thức khác mô tả các phần tùy chọn.
Ví dụ:
chính sách = jsonencode({
Phiên bản = 2012-10-17"
Tuyên bố = [
hợp nhất (
{
Hiệu ứng = "Cho phép"
Hành động = [
"ses:Gửi Email",
"ses:SendRawEmail",
]
Tài nguyên = "*"
},
hợp nhất (var.condition ? {
Điều kiện = {
StringEquals = {
"ses:FromAddress" = [
var.user_email_address,
]
}
}
} : vô giá trị, {}),
)
]
})
Những gì tôi đã thay đổi ở đây hơi tinh tế và có lẽ khó nhìn thấy với tất cả các nội dung khác không thay đổi, vì vậy đây là phiên bản rút gọn với một số yếu tố trước đó được thay thế bằng nhận xét chỉ để làm cho nội dung mới nổi bật hơn :
chính sách = jsonencode({
Phiên bản = 2012-10-17"
Tuyên bố = [
hợp nhất (
{
# (thuộc tính phổ biến ở đây)
},
hợp nhất (var.condition ? {
# (thuộc tính có điều kiện ở đây)
} : vô giá trị, {}),
)
]
})
Các hợp nhất
chức năng lấy nhiều đối tượng và trả về một đối tượng duy nhất chứa các phần tử từ tất cả chúng được lấy cùng nhau. Trong trường hợp này, đối số thứ hai để hợp nhất
là một biểu thức phức tạp hơn để tạo ra một đối tượng với một Điều kiện, tình trạng, trạng thái
thuộc tính hoặc một đối tượng trống tùy thuộc vào giá trị điều kiện. Hợp nhất một đối tượng trống thành một đối tượng không thay đổi gì về kết quả, và do đó, trong trường hợp này, điều kiện sẽ kiểm soát xem đối số thứ hai đó có đóng góp bất kỳ thuộc tính nào hay không.