Terraform `for_each` 精講:優雅地自動化多域名證書驗證

大家好,在云原生和自動化運維的世界里,Terraform無疑是基礎設施即代碼(IaC)領域的王者。它強大的聲明式語法讓我們能夠輕松地描述和管理云資源。然而,即使是經驗豐富的工程師,在面對某些動態場景時也可能會遇到挑戰。

今天,我們就來深入探討一個非常經典且實用的場景:如何使用 for_each 表達式,優雅地自動化處理 AWS ACM (Certificate Manager) 證書的 DNS 驗證,特別是當一個證書包含多個域名時。在這里插入圖片描述

問題的提出:多域名證書的DNS驗證之痛

在現代Web應用中,一個服務擁有多個訪問域名是非常普遍的。例如,主域名 test.core.org,以及一系列子域名如 admin-test.core.orgagent-test.core.org 等。為了啟用HTTPS,我們需要為所有這些域名申請一個SSL/TLS證書。AWS ACM提供了一個便捷的方式,就是將這些域名都作為“主題備用名稱”(Subject Alternative Names, SANs)添加到一個證書中。

讓我們來看一下申請這樣一個證書的Terraform代碼:

resource "aws_acm_certificate" "cloudfront" {provider          = aws.cloudfrontdomain_name       = "test.core.org"validation_method = "DNS"subject_alternative_names = ["admin-test.core.org","agent-test.core.org","mmts-test.core.org","static-test.core.org"]tags = {Environment = "test"}lifecycle {create_before_destroy = true}
}

代碼很直觀,我們定義了一個主域名和四個備用域名。我們選擇了 DNS 作為驗證方法,這意味著AWS會為 每一個 域名(包括主域名和所有SANs)生成一個唯一的CNAME記錄,我們需要將這些記錄發布到我們的DNS服務商(比如AWS Route 53)的DNS區域(Zone)中,以證明我們對這些域名的所有權。

問題來了:AWS為5個域名生成了5組不同的驗證信息。我們該如何為這5個域名動態創建對應的DNS記錄呢?手動創建?當然不行,這違背了IaC的初衷。寫5個 aws_route53_record 資源塊?代碼冗余且難以維護。

這時,for_each 就該閃亮登場了。

解決方案:for_each 的魔法

for_each 是 Terraform 0.12.6 版本引入的重大特性,它允許我們基于一個 map 或 set of strings 來創建多個相似資源的實例。這正是解決我們問題的完美工具。

當我們創建 aws_acm_certificate 資源后,Terraform會通過其 domain_validation_options 屬性導出一組對象,其中包含了每個域名驗證所需的所有信息。 這是一個列表(list),每個對象包含 domain_nameresource_record_nameresource_record_typeresource_record_value 等關鍵信息。

我們的目標就是遍歷這個列表,為每個元素創建一個 aws_route53_record 資源。

下面就是使用了 for_each 的解決方案代碼,也是本次講解的核心:

data "aws_route53_zone" "selected" {name         = "core.org."private_zone = false
}resource "aws_route53_record" "cloudfront_validation" {# for_each 的魔法在這里!for_each = {for dvo in aws_acm_certificate.cloudfront.domain_validation_options : dvo.domain_name => dvo}zone_id = data.aws_route53_zone.selected.zone_idname    = each.value.resource_record_nametype    = each.value.resource_record_typerecords = [each.value.resource_record_value]ttl     = 60
}

讓我們來逐行解析這段代碼的精髓。

深入解析 for_each 表達式

for_each 的核心在于它接受一個 map 類型的值。然而,aws_acm_certificate.cloudfront.domain_validation_options 是一個 list of objects。因此,我們需要使用Terraform的 for 表達式將其轉換成一個 map。

{for dvo in aws_acm_certificate.cloudfront.domain_validation_options : dvo.domain_name => dvo
}

這行代碼做了什么?

  1. for dvo in ...: 這是一個循環,遍歷 domain_validation_options 列表中的每一個對象,并將當前對象賦值給臨時變量 dvo
  2. ... : dvo.domain_name => dvo: 這是 for 表達式生成map的關鍵部分。它遵循 key => value 的語法。
    • dvo.domain_name 作為 map 的 key。我們使用每個待驗證的域名(例如 “test.core.org”)作為鍵。這非常重要,因為 for_each 要求的 map key 必須是唯一的字符串,而域名正好滿足這個條件。
    • dvo 作為 map 的 value。我們將完整的驗證信息對象 dvo 作為值。

經過這個轉換,我們就得到了一個類似下面這樣的map(值為示意):

{"test.core.org" = { domain_name = "test.core.org", resource_record_name = "_c123.test.core.org", ... },"admin-test.core.org" = { domain_name = "admin-test.core.org", resource_record_name = "_c456.admin-test.core.org", ... },...
}
使用 each 對象引用值

一旦 for_each 接收到這個map,Terraform就會為map中的每一個鍵值對創建一個 aws_route53_record 資源的實例。在資源塊內部,我們可以通過特殊的 each 對象來訪問當前實例的 key 和 value。

  • each.key: 在我們的例子中,它會是 “test.core.org”, “admin-test.core.org” 等域名字符串。
  • each.value: 它會是我們賦給 map value 的 dvo 對象。

因此,代碼中的這幾行就變得非常好理解了:

  • name = each.value.resource_record_name: 設置DNS記錄的名稱,例如 _c123.test.core.org
  • type = each.value.resource_record_type: 設置DNS記錄的類型,通常是 CNAME
  • records = [each.value.resource_record_value]: 設置DNS記錄的值,這是AWS提供的用于驗證的唯一字符串。

通過這種方式,我們僅用一個資源塊就動態地為所有需要驗證的域名創建了對應的DNS記錄,代碼簡潔、可讀性高,且易于擴展。如果未來證書增加了新的SAN,我們只需要修改 aws_acm_certificate 資源中的 subject_alternative_names 列表,apply 時 Terraform 會自動為新域名創建驗證記錄。

實用建議與注意事項
  1. 依賴關系:Terraform足夠智能,它能理解 aws_route53_record.cloudfront_validation 依賴于 aws_acm_certificate.cloudfront。它會先創建證書請求,獲取 domain_validation_options,然后再創建DNS記錄。
  2. 等待驗證完成:請注意,上面的代碼只負責創建DNS記錄。證書的狀態此時仍然是 PENDING_VALIDATION。在實際生產中,你還需要使用 aws_acm_certificate_validation 資源來明確告訴Terraform,需要等待DNS記錄生效且證書驗證通過后,才能繼續創建依賴此證書的其他資源(如Load Balancer Listener或CloudFront Distribution)。
  3. key 的選擇:將 for 表達式轉換為map時,選擇一個穩定且唯一的字符串作為key至關重要。dvo.domain_name 是一個絕佳的選擇。
結論

Terraform 的 for_each 循環遠不止是創建多個資源的語法糖。它是一種處理動態、集合類基礎設施的強大范式。通過今天對AWS ACM證書DNS驗證案例的剖析,我們可以看到:

  • 提升了代碼的簡潔性:避免了大量重復的資源定義。
  • 增強了代碼的可維護性:當域名列表變化時,無需修改DNS記錄部分的代碼。
  • 體現了IaC的核心思想:將基礎設施的邏輯關系清晰地表達出來,實現了真正的自動化。

希望這篇文章能幫助大家更深入地理解 for_each 的強大之處,并將其應用到我們的日常工作中,解決更多自動化運維的難題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88092.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88092.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++標準庫中各種互斥鎖的用法 mutex

示例 僅供參考學習 #include <mutex> #include <shared_mutex> #include <thread> #include <chrono> #include <iostream> #include <vector>// // 1. std::mutex - 基本互斥鎖 // void basic_mutex_example() {std::mutex mtx;int cou…

Android Handler機制與底層原理詳解

Android 的 Handler 機制是跨線程通信和異步消息處理的核心框架&#xff0c;它構成了 Android 應用響應性和事件驅動模型的基礎&#xff08;如 UI 更新、后臺任務協調&#xff09;。其核心思想是 “消息隊列 循環處理”。 核心組件及其關系Handler (處理器): 角色: 消息的發送…

jQuery JSONP:實現跨域數據交互的利器

jQuery JSONP&#xff1a;實現跨域數據交互的利器 引言 隨著互聯網的發展&#xff0c;跨域數據交互的需求日益增加。在Web開發中&#xff0c;由于同源策略的限制&#xff0c;直接通過XMLHttpRequest請求跨域數據會遇到諸多問題。而JSONP&#xff08;JSON with Padding&#xff…

Redis集群和 zookeeper 實現分布式鎖的優勢和劣勢

在分布式系統中&#xff0c;實現分布式鎖是確保多個節點間互斥訪問共享資源的一種常見需求。Redis 集群 和 zookeeper 都可以用來實現這一功能&#xff0c;但它們有著各自不同的優勢和劣勢。 CAP 理論&#xff1a; 在設計一個分布式系統時&#xff0c;一致性&#xff08;Consis…

如何備份vivo手機中的聯系人?

隨著vivo移動設備在全球設立7個研發中心&#xff0c;vivo正在進入更多的國家。如今&#xff0c;越來越多的人開始使用vivo手機。以vivo X100為例&#xff0c;它配備了主攝像頭和多個輔助攝像頭&#xff0c;提供多樣化的拍攝選項&#xff0c;并搭載了最新的FunTouch OS&#xff…

python腳本編程:使用BeautifulSoup爬蟲庫獲取熱門單機游戲排行榜

BeautifulSoup是一個便捷的解析html頁面元素的python庫&#xff0c;此處用來寫一個簡單的爬蟲批量抓取國內游戲資訊網站的近期熱門單機游戲排行榜。 網頁來源如下所示代碼 from bs4 import BeautifulSoup import requests# get web page web_url "https://www.3dmgame.co…

C#配置全面詳解:從傳統方式到現代配置系統

C#配置全面詳解&#xff1a;從傳統方式到現代配置系統 在軟件開發中&#xff0c;配置是指應用程序運行時可調整的參數集合&#xff0c;如數據庫連接字符串、API 地址、日志級別等。將這些參數從代碼中分離出來&#xff0c;便于在不修改代碼的情況下調整應用行為。C# 提供了多種…

數據中臺架構解析:湖倉一體的實戰設計

目錄 一、數據中臺與湖倉一體架構是什么 1. 數據中臺 2. 湖倉一體架構 3. 湖倉一體在數據中臺里的價值 二、湖倉一體架構的核心部件 1. 數據湖 2. 數據倉庫 3. 數據集成工具 4. 數據分析與處理引擎 三、湖倉一體架構實戰設計 1. 需求分析與規劃 2. 數據湖建設 3. …

SQL Server表分區技術詳解

表分區概述 表分區是將大型數據庫表物理分割為多個較小單元的技術,邏輯上仍表現為單一實體。該技術通過水平分割數據顯著提升查詢性能,尤其針對TB級數據表可降低90%的響應時間。典型應用場景包含訂單歷史表、日志記錄表等具有明顯時間特征的業務數據,以及需要定期歸檔的審計…

WHIP(WebRTC HTTP Ingestion Protocol)詳解

WHIP&#xff08;WebRTC HTTP Ingestion Protocol&#xff09;詳解 WHIP&#xff08;WebRTC HTTP Ingestion Protocol&#xff09;是一種基于 HTTP 的協議&#xff0c;用于將 WebRTC 媒體流推送到媒體服務器&#xff08;如 SRS、Janus、LiveKit&#xff09;。它是為簡化 WebRT…

圖像噪點消除:用 OpenCV 實現多種濾波方法

在圖像處理中&#xff0c;噪點是一個常見的問題。它可能是由于圖像采集設備的缺陷、傳輸過程中的干擾&#xff0c;或者是光照條件不佳引起的。噪點會影響圖像的質量和后續處理的效果&#xff0c;因此消除噪點是圖像預處理的重要步驟之一。本文將介紹如何使用 OpenCV 實現幾種常…

AI的Prompt提示詞:英文寫好還是中文好?

在與AI人大模型交互時,Prompt(提示詞)的質量直接決定了輸出的精準度和有效性。一個常見的問題是:究竟是用英文寫Prompt好,還是用中文寫更好?這并非一個簡單的二元選擇,而是涉及到語言模型的底層邏輯、表達的精確性以及個人使用習慣的綜合考量。 英文Prompt的優勢 模型訓…

react的條件渲染【簡約風5min】

const flag1true; console.log(flag1&&hello); console.log(flag1||hello); const flag20; console.log(flag2&&hello); console.log(flag2||hello); // &&運算符&#xff0c;如果第一個條件為假&#xff0c;則返回第一個條件&#xff0c;否則返回第二…

【RK3568+PG2L50H開發板實驗例程】FPGA部分 | 紫光同創 IP core 的使用及添加

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com)1.實驗簡介實驗目的&#xff1a;了解 PDS 軟件如何安裝 IP、使用 IP 以及查看 IP 手冊實驗環境&#xff1a;Window11 PD…

thinkphp微信小程序一鍵獲取手機號登陸(解密數據)

微信小程序獲取手機號登錄的步驟相對較為簡單,主要分為幾個部分: 1.用戶授權獲取手機號: 微信小程序通過調用 wx.getPhoneNumber API 獲取用戶授權后,獲取手機號。 2.前端獲取用戶的手機號: 用戶在小程序中點擊獲取手機號時,系統會彈出授權框,用戶同意后,你可以通過 …

數據庫設計精要:完整性和范式理論

文章目錄數據的完整性實體的完整性主鍵域完整性參照完整性外鍵多表設計/多表理論一對一和一對多多對多數據庫的設計范式第一范式&#xff1a;原子性第二范式&#xff1a;唯一性第三范式&#xff1a;不冗余性數據的完整性 實體的完整性 加主鍵&#xff0c;保證一個表中每一條數…

智能推薦社交分享小程序(websocket即時通訊、協同過濾算法、時間衰減因子模型、熱度得分算法)

&#x1f388;系統亮點&#xff1a;websocket即時通訊、協同過濾算法、時間衰減因子模型、熱度得分算法&#xff1b;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架項目架構&#xff1a;B/S架構運行環境&#xff1a;win10/win11、jdk17小程…

部署NextCloud AIO + Frp + nginx-proxy-manager內網穿透私有云服務

網絡拓撲 假設已有域名為nextcloud.yourhost.com 用戶通過域名https訪問 -> Nginx -> frps -> frpc -> NextCloud 其中Nginx和frps安裝在具有公網IP的服務器上&#xff0c;frpc和NextCloud安裝在內網服務器中。 Nginx配置 通過docker安裝nginx-proxy-manager 外…

【源力覺醒 創作者計劃】文心開源大模型ERNIE-4.5-0.3B-Paddle私有化部署保姆級教程及技術架構探索

一起來輕松玩轉文心大模型吧&#x1f449;一文心大模型免費下載地址: https://ai.gitcode.com/theme/1939325484087291906 前言 2025年6月30日&#xff0c;百度正式開源文心大模型4.5系列&#xff08;ERNIE 4.5&#xff09;&#xff0c;涵蓋10款不同參數規模的模型&#xff0…

大模型面試:如何解決幻覺問題

在大模型面試中回答“如何解決幻覺”問題時&#xff0c;需要展現你對問題本質的理解、技術方案的掌握以及工程實踐的洞察。以下是一個結構化的回答框架和關鍵點&#xff0c;供你參考&#xff1a;回答框架&#xff1a;問題理解 -> 解決方案 -> 總結 1. 明確問題&#xff0…