Điểm:0

Terraform: Làm cách nào để tạo động một khối chính sách JSON?

lá cờ cn

Tôi có tài nguyên sau:

tài nguyên "aws_iam_user_policy" "ses_send_policy" {
  đếm = var.enabled? 1 : 0
  name_prefix = var.user_policy_name_prefix
  người dùng = aws_iam_user.ses_smtp_user[0].name

  chính sách = << EOF
{
    "Phiên bản": "17-10-2012",
    "Bản tường trình": [
        {
            "Hiệu ứng": "Cho phép",
            "Hoạt động": [
                "ses:Gửi Email",
                "ses:SendRawEmail"
            ],
            "Nguồn": "*",
            "Điều kiện, tình trạng, trạng thái": {
                "StringEquals": {
                    "ses:FromAddress": [
                        "${var.user_email_address}"
                    ]
                }
            }
        }
    ]
}
EOF
}

Tôi muốn hỏi làm cách nào để tạo khối "Điều kiện" trong chính sách tùy chọn và dựa trên biến kiểu bool? Tôi muốn có nó chỉ khi var.condition = true.

Điểm:0
lá cờ ph

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ệ.

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.

Jacek avatar
lá cờ cn
Giải thích tuyệt vời, cảm ơn bạn.
Jacek avatar
lá cờ cn
Một câu hỏi, mã hoạt động nhưng chính sách nó theo thứ tự hoàn nguyên, tại sao vậy?
lá cờ ph
Tôi không chắc ý của bạn là "hoàn nguyên thứ tự", nhưng có lẽ bạn đã nhận thấy rằng `jsonencode` sẽ luôn sắp xếp các thuộc tính đối tượng theo tên của chúng vì một đối tượng trong là một tập hợp các thuộc tính _unordered_, và do đó `jsonencode` có để tự quyết định một số trật tự.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.