

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>max-stackoverflow &#8211; Max的程式語言筆記</title>
	<atom:link href="https://stackoverflow.max-everyday.com/author/max-stackoverflow/feed/" rel="self" type="application/rss+xml" />
	<link>https://stackoverflow.max-everyday.com</link>
	<description>我要當一個豬頭，快樂過每一天</description>
	<lastBuildDate>Thu, 23 Apr 2026 08:22:03 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://stackoverflow.max-everyday.com/wp-content/uploads/2017/02/max-stackoverflow-256.png</url>
	<title>max-stackoverflow &#8211; Max的程式語言筆記</title>
	<link>https://stackoverflow.max-everyday.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>編碼、加工、加密的區別</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/encoding-processing-encryption/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/encoding-processing-encryption/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 23 Apr 2026 08:22:03 +0000</pubDate>
				<category><![CDATA[電腦相關應用]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8345</guid>

					<description><![CDATA[base64編碼, 再套上額外的加工處理, 就會...]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="559" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/encoding-processing-encryption_clean-1024x559.jpg?v=1776932483" alt="" class="wp-image-8346" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/encoding-processing-encryption_clean-1024x559.jpg?v=1776932483 1024w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/encoding-processing-encryption_clean-600x327.jpg?v=1776932483 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/encoding-processing-encryption_clean-768x419.jpg?v=1776932483 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/encoding-processing-encryption_clean.jpg?v=1776932483 1408w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>base64編碼, 再套上額外的加工處理, 就會變成加密嗎?</p>



<p><strong>不會。不論你疊加多少層處理，只要沒有「金鑰（Key）」的參與，它永遠只是「編碼」，而不是「加密」。</strong></p>



<p>這是一個非常經典的資訊安全觀念誤區。讓我們來拆解一下為什麼「加工過的 Base64」依然不等於加密：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1. 編碼 (Encoding) vs. 加密 (Encryption)</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>特性</strong></td><td><strong>編碼 (如 Base64)</strong></td><td><strong>加密 (如 AES, RSA)</strong></td></tr></thead><tbody><tr><td><strong>目的</strong></td><td>資料格式轉換（確保傳輸不亂碼）</td><td>保護資料內容（防止未經授權讀取）</td></tr><tr><td><strong>安全性</strong></td><td><strong>無</strong>。任何人都能還原</td><td><strong>高</strong>。必須有「金鑰」才能還原</td></tr><tr><td><strong>演算法</strong></td><td>公開且固定的邏輯</td><td>基於數學難題與隱私金鑰</td></tr><tr><td><strong>隱藏性</strong></td><td>只是換個樣子，內容仍是公開的</td><td>沒有金鑰，內容看起來像隨機雜訊</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 為什麼「額外加工」不等於加密？</h3>



<p>如果你把 Base64 編碼後的字串拿去翻轉、平移（凱撒密碼）、或是把特定的字元換掉，這在密碼學中稱為 <strong>「隱寫術」或「模糊化」（Obfuscation）</strong>，而非真正的加密。</p>



<ul class="wp-block-list">
<li><strong>安全依賴於「秘密演算法」：</strong> 這種做法的安全性建立在「對方不知道你做了什麼處理」。但在密碼學中，這違反了 <strong>柯克霍夫原則（Kerckhoffs&#8217;s principle）</strong>：一個系統的安全性應該建立在「金鑰」的保密上，而不是「演算法」的保密上。</li>



<li><strong>容易被破解：</strong> 對於現代電腦或資安人員來說，透過統計分析（頻率分析）或觀察規律，這種「加工」後的邏輯很快就會被識破。一旦邏輯被發現，你所有的資料就門戶大開了。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 什麼才叫「加密」？</h3>



<p>真正的加密必須包含一個核心元素：<strong>金鑰 (Key)</strong>。</p>



<p>C = E(K, P)</p>



<p>在這個公式中：</p>



<ul class="wp-block-list">
<li>P 是明文 (Plaintext)</li>



<li>K 是金鑰 (Key)</li>



<li>E 是加密演算法 (Encryption Algorithm)</li>



<li>C 是密文 (Ciphertext)</li>
</ul>



<p>即使全世界都知道你用了 AES 演算法（E），只要他們拿不到你的金鑰（K），他們就絕對無法算出原本的內容。而 Base64 的加工處理通常不涉及金鑰，它只是一個 f(x) 的變換過程而已。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 什麼時候會把它們放在一起用？</h3>



<p>在實際開發中，我們確實常看到它們同時出現，但順序通常是：</p>



<ol start="1" class="wp-block-list">
<li><strong>加密：</strong> 先用 AES 或 RSA 把資料加密成二進位亂碼。</li>



<li><strong>編碼：</strong> 因為加密後的亂碼在 HTTP 傳輸或資料庫儲存時容易出錯，所以我們會用 <strong>Base64</strong> 把這串亂碼轉成純文字格式。</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>小結：</strong></p>



<p>Base64 是「換衣服」（換個樣子），加工處理是「把衣服反過來穿」。</p>



<p>只有加密才是把資料鎖進「保險箱」。</p>



<p><strong>如果你需要保護敏感資料（如密碼、個資），請務必使用標準的加密函式庫（AES, ChaCha20 等），千萬不要依賴自創的 Base64 變形。</strong></p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>有沒有方法支援單一字元加密, 還可以支援 sql command like &#8216;%keyword%&#8217; 查詢?</p>



<p>這是一個在資安與資料庫效能之間非常經典的兩難問題。</p>



<p>通常情況下，<strong>「加密」與「模糊查詢（LIKE）」是互斥的</strong>。因為加密的本質是為了消除資料的統計規律（讓輸出看起來像隨機亂碼），而 <code>LIKE '%keyword%'</code> 的本質則是尋找特定的規律。</p>



<p>不過，實務上確實有一些折衷方案或進階技術可以達成你的需求：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1. 同態加密 (Homomorphic Encryption)</h3>



<p>這是數學上最完美的解法，允許你在加密後的資料上直接進行運算或搜尋，而不需要解密。</p>



<ul class="wp-block-list">
<li><strong>優點：</strong> 極致安全，資料在伺服器端永遠是加密狀態。</li>



<li><strong>缺點：</strong> <strong>效能極差</strong>。目前處理單一字元或字串搜尋的計算成本太高，不適合用於一般高頻率查詢的 Web 系統。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 確定性加密 (Deterministic Encryption)</h3>



<p>普通的加密（如帶有隨機 Salt 的 AES）會導致同樣的「A」每次加密結果都不同。而「確定性加密」確保同樣的字元永遠加密成同樣的密文。</p>



<ul class="wp-block-list">
<li><strong>做法：</strong> 如果你將每個字元獨立加密（例如：<code>A</code> $\rightarrow$ <code>x8!</code>, <code>B</code> $\rightarrow$ <code>q2@</code>）。</li>



<li><strong>搜尋：</strong> <code>LIKE '%ABC%'</code> 就會變成 <code>LIKE '%x8!q2@...%'</code>。</li>



<li><strong>缺點（致命傷）：</strong> <strong>易受頻率分析攻擊</strong>。如果駭客知道你這是單一字元加密，他們只要統計哪個密文出現最多次，就能猜出那是「e」或「空格」，安全性與 Base64 加工差不了多少。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 可搜尋加密 (Searchable Encryption) 與 盲索引 (Blind Index)</h3>



<p>這是目前業界（如 Signal 或一些金融系統）較推薦的實務做法。我們不直接在加密欄位上 <code>LIKE</code>，而是額外建立一個<strong>輔助用的索引欄位</strong>。</p>



<h4 class="wp-block-heading">實作方式：n-gram 盲索引</h4>



<ol start="1" class="wp-block-list">
<li><strong>拆分：</strong> 將字串拆解成小單位（例如每兩個字一組，稱為 Bigram）。例如 &#8220;APPLE&#8221; 拆成 <code>AP</code>, <code>PP</code>, <code>PL</code>, <code>LE</code>。</li>



<li><strong>雜湊 (Hash)：</strong> 將這些小單位透過 <strong>HMAC</strong>（帶金鑰的雜湊）轉成不可逆的代碼。</li>



<li><strong>儲存：</strong> 把這些代碼存入一個專門用來搜尋的關聯表。</li>



<li><strong>查詢：</strong> 當使用者搜 &#8220;PP&#8221; 時，系統先將 &#8220;PP&#8221; 轉成同樣的 HMAC 代碼，再去索引表裡面找對應的原始資料 ID。</li>
</ol>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>原始資料</strong></td><td><strong>加密欄位 (AES)</strong></td><td><strong>盲索引欄位 (HMACs)</strong></td></tr></thead><tbody><tr><td>APPLE</td><td><code>0xAF23...</code></td><td><code>hash(AP), hash(PP), hash(PL)...</code></td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 數據遮罩與代碼化 (Tokenization)</h3>



<p>如果你的需求是針對特定格式（如身份證字號、信用卡），可以使用「格式保留加密 (FPE)」。</p>



<ul class="wp-block-list">
<li><strong>特性：</strong> 加密後的長度與格式不變。</li>



<li><strong>搜尋：</strong> 雖然可以支援部分查詢，但通常僅限於「前綴」或「後綴」，對於 <code>LIKE '%中間內容%'</code> 依然吃力。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">總結建議</h3>



<p>如果你需要 <strong>「高安全性」</strong> 且 <strong>「支援 SQL LIKE」</strong>：</p>



<ol start="1" class="wp-block-list">
<li><strong>最簡單但較不安全：</strong> 使用確定性加密，但不要逐字加密，而是逐詞或針對整個欄位，這僅能支援「完全符合」的查詢。</li>



<li><strong>標準專業作法：</strong> 建立 <strong>Blind Index (盲索引)</strong>。將常用的搜尋關鍵字（或 n-grams）經過 HMAC 處理後存入獨立欄位。</li>



<li><strong>小數據量方案：</strong> 如果資料只有幾千條，最省事的方法是 <strong>「拉到記憶體裡處理」</strong>：全部撈出來在應用層解密後再篩選（但資料量大時會造成崩潰）。</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>關鍵提醒：</strong> &gt; 「單一字元加密」是非常危險的作法，因為它的熵（Entropy）太低，在現代運算能力下幾乎等同於明文。</p>
</blockquote>



<p>你目前的資料量級大約是多少？這會決定哪種方案最適合你。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/encoding-processing-encryption/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>LLM 200K vs 400K: AI Context Length</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/200k-vs-400k-ai-context-length/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/200k-vs-400k-ai-context-length/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 23 Apr 2026 07:48:53 +0000</pubDate>
				<category><![CDATA[AI開發筆記]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8339</guid>

					<description><![CDATA[其實現在 Claude Sonnet 4.6 的...]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="559" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/200k-vs-400k-ai-context-length_clean-1024x559.jpg?v=1776930514" alt="" class="wp-image-8342" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/200k-vs-400k-ai-context-length_clean-1024x559.jpg?v=1776930514 1024w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/200k-vs-400k-ai-context-length_clean-600x327.jpg?v=1776930514 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/200k-vs-400k-ai-context-length_clean-768x419.jpg?v=1776930514 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/200k-vs-400k-ai-context-length_clean.jpg?v=1776930514 1408w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>其實現在 Claude Sonnet 4.6 的 200K 容量，對於我們平常寫寫小功能、看幾個檔案來說，真的已經超級夠用了！感覺就像是有一個記性很好的助手在旁邊。</p>



<p>不過啊，真的遇到下面這些「大場面」的時候，GPT-5.3-Codex 那種 400K 的大容量，真的會從「加分」變成「救命神具」：</p>



<ul class="wp-block-list">
<li><strong>遇到那種「巨型專案」：</strong> 如果你手上接的是那種超大的老專案，檔案之間關係亂七八糟，200K 可能才讀到一半就滿了。這時候 400K 才能讓 AI 真的把整個核心邏輯「看完整」，不會發生看到後面就忘了前面的尷尬狀況 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f605.png" alt="😅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>



<li><strong>要來場「跨檔案大手術」：</strong>如果要改一個被到處引用的底層介面，最怕改了這、爛了那。有了 400K，AI 就能同時掃描幾百個檔案，幫你顧好全局，不會讓你在改 A 檔案時，不小心把遠在天邊的 B 檔案也搞壞了 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>



<li><strong>面對噴不停的系統日誌：</strong>當伺服器報錯噴出一長串像天書一樣的日誌時，200K 可能只能看最近幾分鐘，但 400K 就能幫你回溯更久的紀錄，抓出那個躲很深的 Bug <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f41b.png" alt="🐛" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>



<li><strong>讓 AI 自己跑長期任務：</strong>現在很流行讓 AI 幫忙自動跑測試、下指令，這些紀錄越累積越多。400K 就像是幫 AI 擴充了記憶體，讓它能持續思考更久，不會跑一半就斷片！</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>我的小小心得：</strong></p>



<p>我覺得工具真的沒有絕對的好壞，重點在於你當下的「戰場」在哪裡。</p>



<p>如果是日常開發，200K 的 Claude 其實又快又準；但如果你今天要挑戰的是那種「魔王級」的代碼迷宮，或是要處理超級冗長的報錯訊息，這時候真的不要省，直接搬出 400K 的大空間，那種不用手動刪減資訊、整坨丟進去的爽快感，真的會讓效率提升好幾個層次呀！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Claude Sonnet 4.6 有比 GPT-5.3-Codex 聰明?</h2>



<p>這是一個超精闢的問題！這兩款頂尖 AI 雖然都是「開發神隊友」，但在你提到的這四個領域中，它們的「個性」和「強項」其實有很明顯的分別喔：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4bb.png" alt="💻" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>寫代碼 (Coding)</strong></h3>



<ul class="wp-block-list">
<li><strong>Claude Sonnet 4.6：</strong> 它是「完美主義的架構師」。寫出來的代碼非常有質感，註解詳盡且遵循現代規範。如果你追求代碼的「可讀性」和「優雅程度」，它通常會讓你驚艷。</li>



<li><strong>GPT-5.3-Codex：</strong> 它是「高效能的執行者」。專門為開發流程優化，反應速度極快。在處理複雜的邏輯實作或呼叫冷門 Library 時，它的準確度（執行成功率）通常略勝一籌。</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>心得：</strong> 想寫出漂亮好維護的新功能找 Claude；要快速搞定複雜演算法邏輯找 Codex。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d1.png" alt="📑" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>分析 Spec (Specification Analysis)</strong></h3>



<ul class="wp-block-list">
<li><strong>Claude Sonnet 4.6：</strong> 強在「細膩的語意理解」。它非常擅長讀懂人類模糊的意圖，並轉化為具體的開發步驟。如果你的 Spec 寫得很潦草，它比較能「心領神會」。</li>



<li><strong>GPT-5.3-Codex：</strong> 強在「海量的全局關聯」。憑藉 400K 的容量，它可以同時吃下上百頁的技術文檔。如果你需要分析「這份新 Spec 會對現有的數十個模組造成什麼連鎖影響」，Codex 的大空間才能確保不漏掉任何細節。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ea.png" alt="🧪" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>寫測試 (Testing)</strong></h3>



<ul class="wp-block-list">
<li><strong>GPT-5.3-Codex：</strong> 在這領域是「全能冠軍」。它具備極強的「反饋循環」能力，會自己跑測試、看報錯、再修正。對於撰寫單元測試 (Unit Test) 或整合測試，它的自動化程度和穩定性非常高。</li>



<li><strong>Claude Sonnet 4.6：</strong> 擅長寫出「具備邊界案例 (Edge Cases) 的測試」。它會幫你想到一些奇怪的輸入情況（例如：負數、空值、特殊字元），讓你的代碼更有韌性。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e1.png" alt="🛡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>分析資安漏洞 (Security Audit)</strong></h3>



<ul class="wp-block-list">
<li><strong>Claude Sonnet 4.6：</strong> 它是「細心的安全稽核員」。在 Anthropic 的安全訓練下，它對常見的漏洞（如：SQL Injection、XSS）極其敏感，且能給出非常人性化的修復建議。</li>



<li><strong>GPT-5.3-Codex：</strong> 它是「深度的系統偵探」。資安漏洞有時隱藏在多個檔案的調用邏輯中，Codex 能利用 400K 的視野追蹤變數在整個專案中的流向，揪出那種跨檔案的邏輯漏洞。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>總結建議</strong></h3>



<p>如果你現在要處理的任務是：</p>



<ol start="1" class="wp-block-list">
<li><strong>寫新功能、優化架構、追求代碼美感</strong>：選 <strong>Claude Sonnet 4.6</strong>。</li>



<li><strong>維護老舊巨型專案、大規模重構、寫自動化測試</strong>：選 <strong>GPT-5.3-Codex</strong>。</li>
</ol>



<p>簡單來說，Claude 贏在「質（理解力）」，而 GPT-5.3-Codex 贏在「量（全局掌控力）」！你目前手上正在處理哪一類的任務呢？或許我可以幫你建議更細的操作方式！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/200k-vs-400k-ai-context-length/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Azure 混合式連線說明</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/azure-hcm/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/azure-hcm/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 11:54:02 +0000</pubDate>
				<category><![CDATA[Azure 筆記]]></category>
		<category><![CDATA[azure]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8335</guid>

					<description><![CDATA[Azure 的混合式連線（Hybrid Conn...]]></description>
										<content:encoded><![CDATA[
<p>Azure 的混合式連線（Hybrid Connections）是一項讓位於 Azure 的雲端服務（如 App Service 或 Azure Functions）可以安全地存取位於內部網路（On-premises）資源的技術。</p>



<p>這些內部資源通常是在公司防火牆後面的資料庫（例如 SQL Server、MySQL）或具備 TCP 連線能力的 HTTP 服務。</p>



<h3 class="wp-block-heading">運作原理</h3>



<p>混合式連線不要求你在防火牆上開啟任何對外的通訊埠（Inbound Port），也不需要建立複雜的 VPN 或 ExpressRoute。它的運作基礎是 Azure Relay。</p>



<p>當你安裝了混合式連線管理員（Hybrid Connection Manager, HCM）在內部網路的伺服器上後，HCM 會透過 443 埠（HTTPS/WebSockets）向 Azure 發起「對外」的連線。雲端的應用程式與內網的 HCM 之間會建立一條雙向的安全隧道，藉此傳輸資料。</p>



<h3 class="wp-block-heading">選取與建立的區別</h3>



<p>在 Azure 控制台看到的那兩段文字，分別代表不同的操作情境：</p>



<ul class="wp-block-list">
<li>新增選取的混合式連線：如果你之前已經在同一個服務匯流排（Service Bus）命名空間中建立過連線，你可以直接從清單中挑選現有的定義，並套用到目前的應用程式。這適合多個 App 需要存取同一個後端資源時使用。</li>



<li>建立新混合式連線：這表示要從頭開始定義一個新的存取路徑。你需要填寫後端資源的主機名稱（如 db-server-01）以及對應的通訊埠（如 1433）。建立完成後，系統會提供一段金鑰，讓你安裝在內網的 HCM 程式使用，完成配對連線。</li>
</ul>



<h3 class="wp-block-heading">優點</h3>



<p>跨平台：只要後端資源支援 TCP 協議（例如資料庫、網頁服務），基本上都能透過這種方式連通。<a href="https://gemini.google.com/app/d9feae7ac1264e42?hl=zh-TW"></a></p>



<p>安全性高：不需要開啟防火牆進入點，大幅降低被攻擊的風險。</p>



<p>設定簡單：不需要變更網路架構或申請靜態 IP。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>針對混合式連線管理員（HCM）與服務匯流排（Service Bus）命名空間，若結合 Microsoft 雲端導入框架（Cloud Adoption Framework, CAF）的規範與實務建議，可以從架構、命名、以及資源管理三個層面來理解。</p>



<h3 class="wp-block-heading">資源與命名空間的關係</h3>



<p>混合式連線本質上是建立在 <strong>Azure Relay</strong> 服務之上的功能。在設定時，系統會要求你選擇或建立一個服務匯流排（Service Bus）命名空間來存放這些連線實體。</p>



<ul class="wp-block-list">
<li><strong>隸屬關係</strong>：每一個混合式連線（Hybrid Connection）都必須隸屬於一個 Service Bus 命名空間。</li>



<li><strong>延遲考量</strong>：CAF 建議將 Service Bus 命名空間部署在與你的 App Service（雲端應用程式）<strong>相同的 Azure 區域</strong>，以減少網路傳遞的延遲。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">CAF 命名建議與規範</h3>



<p>根據 CAF 的資源命名慣例，命名應具備可讀性與組織性，建議格式如下：</p>



<p><code>sb-&lt;應用程式名稱&gt;-&lt;環境&gt;-&lt;地區&gt;-&lt;編號&gt;</code></p>



<ul class="wp-block-list">
<li><strong>sb (Service Bus Prefix)</strong>：資源類型的簡寫，Service Bus 命名空間通常使用 <code>sb</code>。</li>



<li><strong>環境</strong>：例如 <code>prod</code> (正式)、<code>dev</code> (開發) 或 <code>test</code> (測試)。</li>



<li><strong>地區</strong>：例如 <code>tw</code> (台灣) 或 <code>hk</code> (香港)。</li>
</ul>



<p><strong>範例：</strong> <code>sb-hrsystem-prod-tw-01</code></p>



<p>這讓 MIS 或維運人員一看就知道這是用於 HR 系統、正式環境、位於台灣機房的服務匯流排。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">混合式連線管理員 (HCM) 的部署建議</h3>



<p>HCM 是安裝在內部網路伺服器上的代理程式（Agent），它是連線成功的關鍵。</p>



<ul class="wp-block-list">
<li><strong>高可用性 (High Availability)</strong>：CAF 建議在生產環境中，針對同一個混合式連線，應在不同的伺服器上安裝<strong>至少兩個 HCM 執行個體</strong>。Azure 會自動在這些活動狀態的執行個體之間進行負載平衡與故障轉移。</li>



<li><strong>安全性 (Security)</strong>：
<ul class="wp-block-list">
<li>HCM 伺服器只需要<strong>對外</strong>存取 Azure 的 443 埠（HTTPS/WebSockets）。</li>



<li>不需要開啟任何入站（Inbound）防火牆規則。</li>



<li>CAF 強烈建議啟用<strong>用戶端授權</strong>，並使用共用存取簽章（SAS）金鑰來管理連線權限。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">實務建議整理表</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>項目</strong></td><td><strong>CAF / 最佳實務建議</strong></td></tr></thead><tbody><tr><td><strong>網路延遲</strong></td><td>命名空間應與 App Service 放在同一個 Azure Region。</td></tr><tr><td><strong>定價層級</strong></td><td>建議至少使用 <strong>Standard (標準)</strong> 層級以獲得更好的 SLA 保證與管理功能。</td></tr><tr><td><strong>監控</strong></td><td>應將命名空間的診斷日誌（Diagnostic Logs）發送至 Log Analytics 以監控連線狀態。</td></tr><tr><td><strong>管理</strong></td><td>避免將過多不相關系統的混合式連線放在同一個命名空間，應以「工作負載（Workload）」為單位進行隔離。</td></tr></tbody></table></figure>



<p>在 Azure 控制台中操作時，選擇「建立新混合式連線」通常會自動引導你完成命名空間的建立或選擇，此時套用上述命名慣例，會對未來的維護有很大幫助。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>針對混合式連線管理員（HCM）與相關資源的命名，遵循 Microsoft 雲端導入框架（CAF）可以確保架構在擴充時保持清晰。以下是具體的命名建議與實務做法。</p>



<h3 class="wp-block-heading">資源命名建議</h3>



<p>在 Azure 中，混合式連線（Hybrid Connection）並非獨立存在的實體，它依賴於服務匯流排（Service Bus）命名空間以及轉送（Relay）實體。</p>



<ol start="1" class="wp-block-list">
<li>服務匯流排命名空間（Service Bus Namespace）建議格式：sb-&lt;系統/專案名稱>-&lt;環境>-&lt;區域>範例：sb-hr-prod-tw用途：這是承載所有連線的容器，應以「用途」而非單一伺服器命名。</li>



<li>混合式連線實體（Hybrid Connection Entity）建議格式：hc-&lt;目標伺服器/服務>-&lt;通訊埠>範例：hc-sqlserver01-1433 或 hc-api-endpoint-8080用途：直接反映這個連線要通往內網的哪台主機與哪個服務。</li>



<li>混合式連線管理員（HCM）安裝主機建議格式：hcm-vm-&lt;流水號>範例：hcm-vm-01, hcm-vm-02用途：安裝在內網的實體機或虛擬機。建議在主機名稱加上 hcm 前綴，方便網路管理員識別這台機器的流量性質。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">CAF 命名組成要素</h3>



<p>CAF 建議的命名應包含以下標籤資訊，透過連字號（-）組合：</p>



<p>資源類型縮寫（Resource type）：例如 sb (Service Bus), hc (Hybrid Connection)。</p>



<p>應用程式名稱（App name）：代表這個連線服務的系統。</p>



<p>環境（Environment）：例如 dev, test, prod。</p>



<p>區域（Region）：縮寫如 tw (Taiwan), hk (Hong Kong)。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">部署與架構建議</h3>



<p>為了符合企業級的穩定性，除了命名外，CAF 還有幾點關鍵建議：</p>



<ol start="1" class="wp-block-list">
<li>分組管理（Grouping）不要將所有不相關的連線塞進同一個服務匯流排。建議依據工作負載（Workload）來區分。例如：薪資系統使用一個 sb，差勤系統使用另一個 sb。這樣在金鑰管理與權限控管上會更安全。</li>



<li>高可用性（High Availability）在內網環境中，針對同一個混合式連線，應至少在兩台不同的主機上安裝 HCM。Azure 會自動在這些主機之間切換流量。這時命名可採用 hcm-host-a 與 hcm-host-b 來區分冗餘成員。</li>



<li>規格層級在正式生產環境中，Service Bus 建議至少選擇標準版（Standard），以支援足夠的連線數與混合式連線功能。</li>
</ol>



<p>透過這種標準化的命名方式，當系統搬遷或擴充規模時，MIS 人員能迅速識別資源歸屬，減少誤刪或配置錯誤的風險。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>要讓位於 Azure 雲端的應用程式連回地端資源，混合式連線管理員（HCM）扮演的是一個主動外連的轉運站角色。它的運作邏輯並非由雲端直接「戳」進你的防火牆，而是從內部主動向外建立通道。</p>



<p>安裝與連通的具體流程如下：</p>



<h3 class="wp-block-heading">安裝與配對</h3>



<p>首先，你需要在地端內網找一台伺服器（Windows Server 2012 以上版本）安裝 HCM 程式。</p>



<ul class="wp-block-list">
<li>在 Azure 入口網站點擊建立新混合式連線後，會得到一串連線字串（Gateway Connection String）。</li>



<li>將此字串貼入地端的 HCM 程式中。</li>



<li>此時 HCM 會透過 TCP 443 埠向 Azure Relay 服務發起連線。</li>
</ul>



<h3 class="wp-block-heading">建立通訊隧道</h3>



<p>一旦 HCM 與 Azure 握手成功，連線狀態會顯示為已連線（Connected）。</p>



<ul class="wp-block-list">
<li><strong>外連請求</strong>：雲端的 App Service 發出存取請求（例如指向 <code>db-server:1433</code>）。</li>



<li><strong>代理轉送</strong>：Azure Relay 收到請求後，會透過剛才 HCM 建立的長連線通道，將封包傳送給地端的 HCM。</li>



<li><strong>本地派送</strong>：地端的 HCM 接收到封包，再以地端伺服器的身份，將請求發送給內網中真正的目標（如 SQL Server）。</li>
</ul>



<h3 class="wp-block-heading">關鍵技術特性</h3>



<p>這種方式之所以適合企業環境，主要有三個原因：</p>



<ul class="wp-block-list">
<li><strong>免開入站埠</strong>：防火牆不需要開啟任何 Incoming Port，這對資安部門來說非常重要。只要內網主機可以連上網（443 埠），連線就能建立。</li>



<li><strong>無需 VPN</strong>：它不需要建立點對點 VPN 或昂貴的專線，設定過程只需幾分鐘。</li>



<li><strong>解析機制</strong>：App Service 會使用 HCM 所在的內網 DNS 環境。只要在 Azure 上設定的主機名稱地端能認得，連線就能成功。</li>
</ul>



<h3 class="wp-block-heading">實際操作建議</h3>



<p>如果你的環境需要穩定運作，請注意以下幾點：</p>



<ul class="wp-block-list">
<li><strong>多主機部署</strong>：在兩台不同的地端伺服器安裝同一個連線的 HCM，這樣當其中一台重啟或更新時，服務不會中斷。</li>



<li><strong>網路出口</strong>：確保地端 HCM 所在的主機沒有嚴格限制對外連線，否則無法連接到 Azure 的服務匯流排。</li>



<li><strong>資源隔離</strong>：一個連線只對應一個特定主機與通訊埠（例如 <code>192.168.1.50:1433</code>），這符合最小權限原則，不會讓整個內網暴露在雲端。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>資源隔離：一個連線只對應一個特定主機與通訊埠, 地端的API 只能被一台雲端的web app access ?</p>



<p>並非如此。資源隔離的定義是指每個混合式連線（Hybrid Connection）的「終點」是固定的，但「起點」可以非常靈活。</p>



<h3 class="wp-block-heading">多對一的存取關係</h3>



<p>一個地端資源（例如一台 API Server）可以同時被多個雲端應用程式存取。</p>



<p>在 Azure 的設定中，混合式連線是一個獨立的資源實體。只要你將該連線實體關聯到不同的 Web App，這些 App 都能透過同一個 HCM 通道連回地端的同一個 API。這在微服務架構中非常常見，例如你的前端 Web App、後端 API App 以及排程用的 Azure Functions，都可以共用同一個連往地端資料庫的混合式連線。</p>



<h3 class="wp-block-heading">資源隔離的真正含義</h3>



<p>所謂的資源隔離（Resource Isolation），重點在於安全控管與範圍限制：</p>



<ul class="wp-block-list">
<li><strong>精確的目標定義</strong>：一個混合式連線必須明確指定目標主機名稱（或 IP）與通訊埠（Port）。例如，你建立了一個連往 <code>api-server:8080</code> 的連線，雲端 App 就只能存取這個主機的 8080 埠，無法存取該機器的 1433 埠或其他內網主機。</li>



<li><strong>按需分配</strong>：你可以決定哪些 Web App 有權掛載這個連線。如果 Web App A 有掛載，它就能連通；如果 Web App B 沒有掛載，它完全無法偵測到地端資源的存在。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">實務建議</h3>



<p>如果你有多個雲端 App 需要存取地端 API，建議做法如下：</p>



<ul class="wp-block-list">
<li><strong>建立單一連線實體</strong>：在 Service Bus 命名空間下建立一個名為 <code>hc-internal-api-8080</code> 的連線。</li>



<li><strong>多點掛載</strong>：分別進入各個 Web App 的「網路」設定頁面，選擇「新增選取的混合式連線」，並指名同一個 <code>hc-internal-api-8080</code>。</li>



<li><strong>流量監控</strong>：雖然多個 App 共用連線，但你仍可以在 Service Bus 的監控圖表中看到整體的連線數與資料傳輸量。</li>
</ul>



<p>總結來說，地端 API 並非只能被一台雲端 App 存取，而是能被「你授權過的」所有雲端資源存取。這種設計讓你在維護地端 HCM 代理程式時更方便，不需要為每個雲端 App 都重複安裝一套地端代理。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>地端的 outbound 要怎麼開?</p>



<p>要讓地端的混合式連線管理員（HCM）成功連回 Azure，地端防火牆不需要開啟任何「入站（Inbound）」規則，但必須確保「出站（Outbound）」通訊順暢。</p>



<p>HCM 是透過 HTTPS（TCP 443 埠）連向雲端的，且必須能與特定類型的 Azure 資源溝通。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">出站防火牆設定規則</h3>



<p>建議 MIS 人員在地端防火牆或代理伺服器（Proxy）上，針對 HCM 所在的主機設定以下規則：</p>



<ul class="wp-block-list">
<li><strong>連接埠（Port）</strong>：必須開啟 <strong>TCP 443</strong>。</li>



<li><strong>傳輸通訊協定</strong>：HTTPS 與 WebSockets（混合式連線依賴 WebSocket 進行雙向傳輸）。</li>
</ul>



<h4 class="wp-block-heading">建議開通的網域名稱（FQDN）</h4>



<p>由於 Azure 的 IP 位址會變動，CAF 建議優先使用 FQDN（網域名稱）進行過濾：</p>



<ol start="1" class="wp-block-list">
<li><strong>*.servicebus.windows.net</strong>這是最重要的核心。混合式連線底層跑的是 Azure Relay，而 Relay 服務掛在 Service Bus 之下。</li>



<li><strong>*.table.core.windows.net</strong>HCM 需要存取 Azure 儲存體資料表來確認連線狀態與配置。</li>



<li><strong>https://www.google.com/search?q=login.microsoftonline.com</strong>用於身份驗證與取得存取權杖（Access Token）。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">如果資安要求必須使用固定 IP</h3>



<p>如果貴單位的防火牆嚴格限制不能使用萬用字元（Wildcard）網域，則必須下載 <strong>Azure IP Ranges and Service Tags</strong> 列表。</p>



<ul class="wp-block-list">
<li><strong>Service Tag</strong>：請搜尋 <strong>AzureRelay</strong> 與 <strong>ServiceBus</strong> 兩個標籤。</li>



<li><strong>注意事項</strong>：Azure 每個區域的 IP 範圍很大且會定期更新。如果使用 IP 過濾，MIS 必須定期更新防火牆白名單，維運成本較高。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">如何測試連線是否成功</h3>



<p>在地端 HCM 主機上，你可以使用 PowerShell 快速測試網路路徑是否通暢：</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code># 測試連往 Service Bus 命名空間的 443 埠
Test-NetConnection -ComputerName &#91;您的命名空間名稱].servicebus.windows.net -Port 443
</code></pre>



<p>如果 <code>TcpTestSucceeded</code> 顯示為 <code>True</code>，表示地端的 outbound 已經成功開通。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">特別提示：關於 Proxy（代理伺服器）</h3>



<p>如果地端環境必須經過 Proxy 才能上網，安裝完 HCM 後，你需要手動修改 HCM 的設定檔（通常是 <code>Microsoft.HybridConnectionManager.Core.dll.config</code>），在 <code>&lt;system.net&gt;</code> 標籤中加入 <code>proxy</code> 設定，它才能正常穿透代理服務。</p>



<p><a href="https://gemini.google.com/app/62f0e7d52af22601?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/a82ab211b3158723?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/b11be2764b1256dd?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/cb5bdf804d01ffdb?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/1c0c9d5953e9dd33?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/16cd80ebc1877e59?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/9d114a48e4b85e73?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/536e39fe898377d6?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/31355a6b4c23a721?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/777f1d68934b04b7?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/0c0876a1db3cdc3d?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/c8e995e39d4a210d?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/2d14c8f229896407?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/3f06330ebeed0449?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/319c24a031f18fe7?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/e0d96ae176cb3243?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/72e65e5dc71d240c?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/1ccba83e952ddf8e?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/61d45d5cf23420fe?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/5a89fdd6c9e238a7?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/4ce514854f09042f?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/5d5c95ce54d507d2?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/f010c3f3aa2a0435?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/a192617677276822?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/c4f06078afd16192?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/8a1e4f6523dd9a21?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/daef535f552bc467?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/f5865a3a4237c23a?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/ac840ab78271a1d1?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/4652c6bbff682f83?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/7f27a2c82730bf1e?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/2c932698548eeb82?hl=zh-TW"></a></p>



<p><a href="https://gemini.google.com/app/5f6b1746a19e4f33?hl=zh-TW"></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/azure-hcm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Azure Front Door (AFD) 與 WAF 比較</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/azure-front-door-afd-app-gateway/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/azure-front-door-afd-app-gateway/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 10:43:48 +0000</pubDate>
				<category><![CDATA[Azure 筆記]]></category>
		<category><![CDATA[azure]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8333</guid>

					<description><![CDATA[簡單來說，Azure Front Door (A...]]></description>
										<content:encoded><![CDATA[
<p>簡單來說，<strong>Azure Front Door (AFD) 本身不是 WAF，但它「包含」並「整合」了 WAF 功能。</strong></p>



<p>你可以把它想像成一個**「全球性的交通樞紐」<strong>，而 WAF 是這個樞紐上的</strong>「安檢門」**。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. 它們的關係是什麼？</h2>



<ul class="wp-block-list">
<li><strong>Azure Front Door (AFD):</strong> 是一個全球性的 <strong>內容傳遞網路 (CDN)</strong> 和 <strong>第 7 層負載平衡器</strong>。它的主要工作是讓你的網站跑得更快（加速）、更穩（高可用性）。</li>



<li><strong>Azure WAF:</strong> 是一個<strong>安全插件/策略</strong>，可以掛載在 Azure Front Door 上。它的主要工作是過濾惡意攻擊（如 SQL 注入、XSS 跨站腳本攻擊）。</li>
</ul>



<h2 class="wp-block-heading">2. 為什麼大家常把它們放在一起講？</h2>



<p>因為當你使用 Azure Front Door 時，通常會<strong>啟用</strong>它的 WAF 功能。這有幾個好處：</p>



<ul class="wp-block-list">
<li><strong>邊緣防護 (Edge Security):</strong> 攻擊在還沒進入你的伺服器（甚至還沒進入 Azure 區域中心）之前，就在全球各地的邊緣節點被攔截了。</li>



<li><strong>集中管理:</strong> 你只需要設定一份 WAF 規則，就能保護全球各地的後端服務。</li>
</ul>



<h2 class="wp-block-heading">3. Azure Front Door 的兩個版本與 WAF 的差異</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>功能</strong></td><td><strong>Standard (標準版)</strong></td><td><strong>Premium (高級版)</strong></td></tr></thead><tbody><tr><td><strong>WAF 支援</strong></td><td>支援自定義規則</td><td><strong>完整支援</strong> (含受管規則集)</td></tr><tr><td><strong>安全防護</strong></td><td>僅基本的自定義 WAF</td><td><strong>進階 Bot 防護</strong>、受管規則集 (DRS)</td></tr><tr><td><strong>適用場景</strong></td><td>一般加速與基礎防護</td><td>對安全性要求極高、怕爬蟲攻擊的企業</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 總結</h3>



<p>如果你需要的是 <strong>WAF（Web 應用程式防火牆）</strong>，在 Azure 中你有兩個主要選擇：</p>



<ol start="1" class="wp-block-list">
<li><strong>Azure Front Door + WAF:</strong> 適用於<strong>全球性/對外</strong>的網站，在邊緣端就攔截攻擊。</li>



<li><strong>Application Gateway + WAF:</strong> 適用於<strong>區域性/虛擬網路內</strong>的架構。</li>
</ol>



<p><strong>你的需求是要幫全球分佈的網站做防護嗎？</strong> 如果是的話，Azure Front Door 的 WAF 功能會是非常強大的選擇。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>在選擇 Azure 防禦方案時，價格結構主要分為「固定月費」與「變動流量費」。以下為 <strong>Azure Front Door (AFD)</strong> 兩個版本與 <strong>Application Gateway (AppGW)</strong> 的價格與定位比較：</p>



<h3 class="wp-block-heading">1. 價格比較表 (預估)</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>費用維度</strong></td><td><strong>AFD Standard (標準版)</strong></td><td><strong>AFD Premium (高級版)</strong></td><td><strong>AppGW + WAF (v2)</strong></td></tr></thead><tbody><tr><td><strong>基本固定月費</strong></td><td>約 <strong>$35</strong> USD/月</td><td>約 <strong>$330</strong> USD/月</td><td>約 <strong>$323</strong> USD/月 ($0.443/hr)</td></tr><tr><td><strong>WAF 策略費</strong></td><td>需額外支付策略/規則費</td><td><strong>已包含</strong> 在月費內</td><td>需額外支付策略/規則費</td></tr><tr><td><strong>流量費用</strong></td><td>按 GB 與請求數計費</td><td>按 GB 與請求數計費</td><td>按 <strong>CU (容量單位)</strong> 計費</td></tr><tr><td><strong>主要 WAF 功能</strong></td><td>僅支援「自定義規則」</td><td>支援「微軟受管規則集」</td><td>支援「微軟受管規則集」</td></tr><tr><td><strong>Bot 防護</strong></td><td>基礎 (Basic)</td><td>進階 (Advanced)</td><td>基礎 (Basic)</td></tr><tr><td><strong>Private Link</strong></td><td>不支援</td><td><strong>支援</strong> (可私連後端)</td><td>不支援 (它是區域性服務)</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 重點解析：該選哪一個？</h3>



<h4 class="wp-block-heading"><strong>Azure Front Door Standard (標準版)</strong></h4>



<ul class="wp-block-list">
<li><strong>適合誰：</strong> 預算有限、主要需要 <strong>CDN 加速</strong>，且只需要簡單的安全規則（如封鎖特定 IP 或地理位置）。</li>



<li><strong>注意：</strong> 如果你需要微軟自動更新的 SQLi/XSS 規則，這個版本「不支援」受管規則集，防禦力較弱。</li>
</ul>



<h4 class="wp-block-heading"><strong>Azure Front Door Premium (高級版)</strong></h4>



<ul class="wp-block-list">
<li><strong>適合誰：</strong> 大型企業、跨國網站、對安全性有高度要求的服務。</li>



<li><strong>關鍵價值：</strong> 它包含了 <strong>WAF 受管規則集</strong>（不需要自己寫防禦代碼）和 <strong>Private Link</strong>。如果你不希望你的後端伺服器暴露在公網上，Premium 是唯一能透過私有網路連接後端的方案。</li>



<li><strong>省錢點：</strong> 雖然月費高，但它免除了 WAF 的政策費與規則費。</li>
</ul>



<h4 class="wp-block-heading"><strong>Application Gateway + WAF v2 (區域型)</strong></h4>



<ul class="wp-block-list">
<li><strong>適合誰：</strong> 服務集中在 <strong>單一區域</strong> (例如只在台灣或香港)，不需要全球加速，且後端架構多為 VM 或 AKS (Kubernetes)。</li>



<li><strong>關鍵差異：</strong> 它是一個區域性服務。如果你有 3 個區域的後端，你就需要買 3 組 AppGW，成本會迅速超過 Front Door。</li>



<li><strong>價格陷阱：</strong> 除了固定費用，它的 <strong>CU (Capacity Unit)</strong> 計費方式較複雜，高併發流量下成本可能波動較大。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 決策建議</h3>



<ul class="wp-block-list">
<li><strong>如果你要保護「全球」流量：</strong> 直接看 <strong>Front Door</strong>。如果只是小型個人網站選 Standard，如果是商業營運、怕被黑、怕爬蟲，請直上 <strong>Premium</strong>。</li>



<li><strong>如果你要保護「單一區域」內的 VNet 資源：</strong> 選擇 <strong>Application Gateway + WAF</strong>。它能更深層地整合你的虛擬網路空間。</li>



<li><strong>如果你極度重視安全（尤其是 Bot 攻擊）：</strong> <strong>Front Door Premium</strong> 的 Bot 防護是三者中最強的（基於微軟威脅情報中心數據）。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>你是打算保護已經上線的既有網站，還是正在規劃新的跨區域架構？</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/azure-front-door-afd-app-gateway/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Azure SMTP 寄信服務選項</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/azure-smtp-mail/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/azure-smtp-mail/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 05:07:24 +0000</pubDate>
				<category><![CDATA[Azure 筆記]]></category>
		<category><![CDATA[azure]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8331</guid>

					<description><![CDATA[Azure 本身並不提供傳統意義上的「開放式 S...]]></description>
										<content:encoded><![CDATA[
<p>Azure 本身並不提供傳統意義上的「開放式 SMTP 伺服器」，但有三種主要方式可以達成 SMTP 寄信需求：</p>



<h3 class="wp-block-heading">Azure Communication Services (ACS)</h3>



<p>這是目前 Azure 原生的推薦方案。它提供 Email 服務，且支援 <strong>SMTP Relay</strong> 功能。</p>



<ul class="wp-block-list">
<li><strong>特點</strong>：按量計費，整合在 Azure 資源管理內，安全性高。</li>



<li><strong>認證方式</strong>：支援透過 Entra ID (原 Azure AD) 的應用程式註冊與 Service Principal 進行認證。</li>



<li><strong>連線資訊</strong>：伺服器通常為 <code>smtp.azurecomm.net</code>，使用連接埠 587。</li>
</ul>



<h3 class="wp-block-heading">Twilio SendGrid</h3>



<p>長期以來 Azure 官方合作的第三方服務，在 Azure 市集中可以直接購買與整合。</p>



<ul class="wp-block-list">
<li><strong>特點</strong>：功能最成熟，有豐富的報表、開信追蹤與行銷工具。</li>



<li><strong>適用場景</strong>：除了簡單的系統通知，還需要處理電子報或進階郵件管理時的首選。</li>



<li><strong>連線資訊</strong>：伺服器為 <code>smtp.sendgrid.net</code>，使用 API Key 作為認證密碼。</li>
</ul>



<h3 class="wp-block-heading">Microsoft 365 (Exchange Online)</h3>



<p>如果你公司本身有在使用 Microsoft 365，也可以透過 Exchange Online 寄信。</p>



<ul class="wp-block-list">
<li><strong>注意事項</strong>：微軟正在全面停用 SMTP 的「基本驗證」（Basic Auth），到 2026 年底後，傳統的帳號密碼登入將失效，必須改用 <strong>OAuth 2.0</strong>。</li>



<li><strong>限制</strong>：有每日寄信限額，且不適合發送大量行銷郵件，較適合內部系統或小量自動化腳本。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">關鍵技術限制與建議</h3>



<ol start="1" class="wp-block-list">
<li><strong>封鎖 Port 25</strong>：Azure 所有的虛擬主機 (VM) 預設都會封鎖對外的 Port 25，以防垃圾郵件。請務必改用 <strong>Port 587 (TLS)</strong>。</li>



<li><strong>固定 IP 信用度</strong>：不建議在 VM 內自建 SMTP 伺服器直接對外寄信，因為雲端 IP 很容易被列入黑名單，寄達率極低。</li>



<li><strong>首選建議</strong>：如果你追求純 Azure 環境與簡單的系統通知，優先考慮 <strong>Azure Communication Services</strong>；如果需要強大的退信分析與行銷功能，選擇 <strong>SendGrid</strong>。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>要在 Exchange Online 使用 SMTP 寄信，由於微軟已經全面停用基本驗證，目前的標準做法是透過 Azure 註冊應用程式並使用 OAuth 2.0。以下是開發者最常用的用戶端憑證流程步驟：</p>



<h3 class="wp-block-heading">1. 在 Microsoft Entra ID 註冊應用程式</h3>



<p>首先要在 Azure 入口網站建立一個身份，讓系統允許你的程式存取 Exchange Online。</p>



<ul class="wp-block-list">
<li>進入 Azure Portal，搜尋並進入 <strong>Microsoft Entra ID</strong>。</li>



<li>點選 <strong>應用程式註冊</strong>，新增一個註冊。</li>



<li>記下 <strong>應用程式 (用戶端) 識別碼</strong> 以及 <strong>目錄 (租戶) 識別碼</strong>，稍後程式碼會用到。</li>



<li>在 <strong>憑證與密碼</strong> 中，新增一個 <strong>用戶端密碼</strong>，產生的數值請立即複製儲存，離開頁面後就看不到了。</li>
</ul>



<h3 class="wp-block-heading">2. 設定 API 權限</h3>



<p>賦予這個應用程式寄信的權利。</p>



<ul class="wp-block-list">
<li>在應用程式註冊頁面點選 <strong>API 權限</strong>。</li>



<li>點選 <strong>新增權限</strong>，選擇 <strong>Microsoft Graph</strong>。</li>



<li>選擇 <strong>應用程式權限</strong> (不是委派權限)。</li>



<li>搜尋並勾選 <code>Mail.Send</code>。</li>



<li>儲存後，務必點選 <strong>代表 [你的組織名稱] 授與管理員同意</strong>，狀態變為綠色勾勾才算生效。</li>
</ul>



<h3 class="wp-block-heading">3. 配置 Exchange Online 服務主體</h3>



<p>這是一個純指令步驟，目的是在 Exchange 系統內建立一個對應的服務主體，並賦予它寄件者權限。你需要安裝 PowerShell 的 ExchangeOnlineManagement 模組。</p>



<ul class="wp-block-list">
<li>連線到 Exchange Online：<code>Connect-ExchangeOnline</code>。</li>



<li>執行以下指令建立連結：</li>
</ul>



<p>PowerShell</p>



<pre class="wp-block-code"><code>New-ServicePrincipal -AppId &lt;你的應用程式ID&gt; -ServiceId &lt;你的應用程式物件ID&gt;
</code></pre>



<ul class="wp-block-list">
<li>賦予特定信箱的寄信權限：</li>
</ul>



<p>PowerShell</p>



<pre class="wp-block-code"><code>Add-MailboxPermission -Identity "sender@yourdomain.com" -User &lt;你的應用程式ID&gt; -AccessRights FullAccess
</code></pre>



<h3 class="wp-block-heading">4. 撰寫程式碼獲取 Token 並寄信</h3>



<p>不能再像以前只輸入帳號密碼，程式邏輯需要改為：</p>



<ol start="1" class="wp-block-list">
<li>向 Microsoft Entra ID 請求 Token。</li>



<li>將 Token 放入 SMTP 連線的認證標頭中。</li>
</ol>



<p>如果使用 Python，可以使用 <code>msal</code> 函式庫來處理認證。</p>



<p>Python</p>



<pre class="wp-block-code"><code>import msal

app = msal.ConfidentialClientApplication(
    client_id, authority=f"https://login.microsoftonline.com/{tenant_id}",
    client_credential=client_secret
)
result = app.acquire_token_for_client(scopes=&#91;"https://graph.microsoft.com/.default"])
access_token = result&#91;'access_token']
</code></pre>



<h3 class="wp-block-heading">5. SMTP 連線設定</h3>



<p>連線資訊維持不變，但認證方式必須支援 XOAUTH2。</p>



<ul class="wp-block-list">
<li><strong>SMTP 伺服器</strong>：<code>smtp.office365.com</code></li>



<li><strong>連接埠</strong>：587</li>



<li><strong>加密方式</strong>：STARTTLS</li>



<li><strong>使用者名稱</strong>：你的完整 Email 地址</li>



<li><strong>密碼</strong>：剛才取得的 <code>access_token</code> 長字串</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">常見問題提醒</h3>



<ul class="wp-block-list">
<li><strong>安全性限制</strong>：如果你的租戶啟用了「安全性預設值」(Security Defaults)，可能會強制要求 MFA，這會導致傳統 SMTP 連線失敗。使用 OAuth 2.0 應用程式權限可以繞過此限制。</li>



<li><strong>寄件人一致性</strong>：你在程式碼中 <code>From</code> 欄位填寫的地址，必須與步驟 3 授權的信箱一致，否則會被 Exchange 拒絕寄送。</li>



<li><strong>權限生效時間</strong>：在 Azure 修改權限後，有時需要等待 5 到 15 分鐘才會完全同步到 Exchange 伺服器。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>在 Azure VNet 內部的後端服務向 Entra ID 請求 Token 是<strong>標準做法</strong>，但為了符合企業級的安全與效能規範，建議不要直接走公網連線，而是透過以下兩種技術進行優化：</p>



<h3 class="wp-block-heading">1. 使用受控識別 (Managed Identities)</h3>



<p>這是最推薦的方案。如果你是將後端服務部署在 Azure VM、App Service 或 Azure Container Apps 上，不應該在程式碼中寫死 Client ID 或 Secret。</p>



<ul class="wp-block-list">
<li><strong>安全性</strong>：你不需要管理憑證或金鑰，Azure 會自動處理身份認證。</li>



<li><strong>運作機制</strong>：程式碼向本地端的一個特定 Endpoint 請求 Token，Azure 基礎設施會負責與 Entra ID 對接並回傳 Token。</li>



<li><strong>網路路徑</strong>：這類請求通常走 Azure 內部的管理平面，不會暴露在公網。</li>
</ul>



<h3 class="wp-block-heading">2. 使用受控識別 (Managed Identity) 結合 Private Link</h3>



<p>如果你的 VNet 有嚴格的資安限制（封鎖所有對外 443 流量），連 Entra ID 的公用端點都不想連，可以考慮使用 <strong>Microsoft Entra Private Link</strong>。</p>



<ul class="wp-block-list">
<li><strong>原理</strong>：在 VNet 內部建立一個 Private Endpoint，讓請求 Entra ID 的流量完全限制在私有網路內。</li>



<li><strong>缺點</strong>：設定較為複雜，且這項功能目前主要針對特定資源存取，對於純粹的 Token 請求，通常只要確保 VNet 允許 HTTPS (443) 傳出至 <code>login.microsoftonline.com</code> 即可。</li>
</ul>



<h3 class="wp-block-heading">為什麼這對後端服務是安全的</h3>



<ul class="wp-block-list">
<li><strong>Service-to-Service 認證</strong>：Entra ID 產生的 Token 是基於應用程式身份（App Role），而不是特定使用者。這非常適合後端無人值守（Headless）的環境。</li>



<li><strong>範圍縮小 (Scoped)</strong>：你可以限制該 Token 僅能用於發送郵件（Mail.Send），無法存取其他資料。</li>



<li><strong>加密傳輸</strong>：所有的 Token 請求都必須強制使用 TLS 1.2 以上加密。</li>
</ul>



<h3 class="wp-block-heading">潛在的效能疑慮與對策</h3>



<p>如果你擔心後端服務頻繁請求 Token 會造成延遲：</p>



<ul class="wp-block-list">
<li><strong>快取機制</strong>：不應每次寄信都請求新 Token。Token 通常有一小時的有效期，程式碼中應該實作快取邏輯，只有在 <code>expires_in</code> 快到期時才重新獲取。如果你使用官方的 <code>MSAL</code> SDK，它會自動幫你處理快取。</li>



<li><strong>網路開銷</strong>：Token 請求只是極小的 JSON 資料，對 VNet 頻寬幾乎沒有影響。</li>
</ul>



<h3 class="wp-block-heading">總結建議</h3>



<p>對於 VNet 內部的後端服務，請求 Token 是完全適合的。最佳實踐是：<strong>優先使用 System-assigned Managed Identity</strong>，並在程式中透過 <strong>DefaultAzureCredential</strong> 來獲取 Token。這樣既不需要在設定檔存密碼，也能確保認證過程符合 Azure 最新的安全規範。</p>



<p>對於寄信這種非高併發的任務，這點認證開銷是可以忽略不計的。你目前比較需要擔心的反而是 VNet 的 NSG 是否有開啟 587 連接埠對外連線至 Office 365 的權限。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>這是一個關於雲端架構安全性的好問題。簡單來說，Microsoft Graph 的確是一個<strong>外網端點</strong>（<a target="_blank" rel="noreferrer noopener" href="https://graph.microsoft.com/">https://graph.microsoft.com</a>），但這並不代表它不安全。</p>



<p>以下從網路層級、認證機制與最佳實踐來分析：</p>



<h3 class="wp-block-heading">Microsoft Graph 的網路位置</h3>



<p>Microsoft Graph 是微軟雲端服務的統一入口，本質上是一個<strong>公用端點 (Public Endpoint)</strong>。這意味著你的 VNet 內部服務需要透過 HTTPS (Port 443) 才能存取它。</p>



<h3 class="wp-block-heading">Backend 存取外網的安全考量</h3>



<p>雖然它是「外網」端點，但實務上它是安全的，原因如下：</p>



<ul class="wp-block-list">
<li><strong>傳輸層加密 (TLS)</strong>：所有與 Graph API 的通訊都強制使用 TLS 1.2 或更高版本，資料在傳輸過程中是加密的。</li>



<li><strong>身分驗證強制性</strong>：沒有有效的 OAuth 2.0 Token，任何人（即使連得上網址）都無法存取任何資料。</li>



<li><strong>微軟骨幹網路</strong>：如果你的 Backend 服務是在 Azure VNet 內，發往 Microsoft Graph 的流量通常會留在 <strong>Microsoft 骨幹網路 (Global Network)</strong> 內部路由，而不會真的繞到公眾網際網路 (Public Internet) 的路由器。</li>
</ul>



<h3 class="wp-block-heading">如何讓存取過程更安全？</h3>



<p>如果你的 VNet 是嚴格隔離的環境（封鎖所有 Outbound 流量），你可以採用以下對策：</p>



<h4 class="wp-block-heading">1. 使用受控識別 (Managed Identity)</h4>



<p>這是最重要的安全措施。</p>



<ul class="wp-block-list">
<li><strong>優點</strong>：你的 Backend 服務不需要儲存任何 Client Secret（金鑰）。身份辨識由 Azure 平台自動處理。</li>



<li><strong>安全性</strong>：即使程式碼外洩，也沒有金鑰可以被盜用。</li>
</ul>



<h4 class="wp-block-heading">2. 設定網路安全組 (NSG) 或是服務標記 (Service Tags)</h4>



<p>你不需要開放「所有外網」權限。</p>



<ul class="wp-block-list">
<li>在 VNet 的 NSG 中，將輸出規則目的地設定為 <strong>Service Tag</strong>：<code>AzureActiveDirectory</code>。</li>



<li>這樣你的後端服務就只能存取身份驗證相關的微軟服務，而不能隨便連到其他的惡意網站。</li>
</ul>



<h4 class="wp-block-heading">3. 透過 Private Link (私密連結)</h4>



<p>雖然 Microsoft Graph 目前還不像 Storage 或 SQL 提供完全的「私有端點」來收發郵件（它主要是針對資料整合），但你可以透過 <strong>Azure API Management (APIM)</strong> 作為代理。</p>



<ul class="wp-block-list">
<li><strong>架構</strong>：VNet -> Private Endpoint -> APIM -> Microsoft Graph。</li>



<li><strong>優點</strong>：你的後端服務完全不需要開啟任何對外網的存取權限。</li>
</ul>



<h3 class="wp-block-heading">總結建議</h3>



<p>對於一般公司內部的後端服務，直接存取 Microsoft Graph 是<strong>符合業界標準</strong>的。只要你：</p>



<ol start="1" class="wp-block-list">
<li>使用 <strong>HTTPS</strong> 連線。</li>



<li>採用 <strong>Managed Identity</strong> (受控識別) 取代金鑰。</li>



<li>在 NSG 中限制僅允許存取 <strong>AzureActiveDirectory</strong> 的 Service Tag。</li>
</ol>



<p>這樣的安全強度對於 MIS 與資安稽核來說通常是足夠的。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>根據 2026 年最新的官方公告與限制說明，Exchange Online 的寄信限額如下：</p>



<h3 class="wp-block-heading">核心寄送限制</h3>



<ul class="wp-block-list">
<li><strong>每日收件者上限</strong>：每個人員信箱每天最多可寄送給 <strong>10,000 個收件者</strong>。</li>



<li><strong>計算方式</strong>：這是一個 24 小時的滑動視窗（Rolling Window），而不是每天凌晨重置。</li>



<li><strong>外部收件者限額 (ERR)</strong>：微軟原本計畫在 2026 年 4 月將「外部收件者」限制在每日 2,000 人，但因客戶反饋激烈，該計畫已於 <strong>2026 年 1 月正式取消</strong>。目前外部收件者依然併入總量 10,000 人的額度內，沒有獨立的較低上限。</li>
</ul>



<h3 class="wp-block-heading">其他關鍵節流限制</h3>



<p>除了總量，還有以下技術限制會影響你的後端程式：</p>



<ul class="wp-block-list">
<li><strong>每分鐘傳送速率</strong>：每分鐘最多寄送 <strong>30 封郵件</strong>。如果超過此速度，Exchange 會回傳重試代碼（Throttling）。</li>



<li><strong>單封郵件收件者人數</strong>：單封 Email 最多只能包含 <strong>500 個收件者</strong>（可由管理者調高至 1,000 個）。</li>



<li><strong>並行連線數</strong>：使用 SMTP AUTH 時，最多支援 <strong>3 個並行連線</strong>。</li>
</ul>



<h3 class="wp-block-heading">租戶層級總額 (TERRL)</h3>



<p>除了單一信箱的限制，整個組織（Tenant）也有一個總對外寄信額度，通常是根據你購買的授權數量來計算：</p>



<ul class="wp-block-list">
<li>公式大致為：<code>500 x (授權數量 ^ 0.7) + 9,500</code>。</li>



<li>這意味著如果你的公司只有 1 個授權，總額就是 10,000 封；如果有 1,000 個授權，總額約為每日 7.2 萬封。</li>
</ul>



<h3 class="wp-block-heading">專家提醒</h3>



<p>如果你的後端服務需要發送大量的系統通知或電子報（例如一天超過一萬封），Exchange Online <strong>並不是</strong>合適的選擇。它被定位為「人員商務通訊」，過量發信容易被系統標記為垃圾郵件發送者。建議若需求量大，應轉向使用 <strong>Azure Communication Services (ACS)</strong> 或 <strong>SendGrid</strong>，這類服務才有專門的信用額度管理與更高的寄送上限。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/azure-smtp-mail/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>台灣資安法規 access log 可以出境外?</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/taiwan-access-log-overseas/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/taiwan-access-log-overseas/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 04:32:23 +0000</pubDate>
				<category><![CDATA[Azure 筆記]]></category>
		<category><![CDATA[azure]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8327</guid>

					<description><![CDATA[下表根據台灣現行法規（如《資通安全管理法》及《個...]]></description>
										<content:encoded><![CDATA[
<p>下表根據台灣現行法規（如《資通安全管理法》及《個人資料保護法》）彙整 access log 是否可儲存或傳輸至境外的原則。</p>



<h2 class="wp-block-heading">核心原則：區分「機關屬性」與「資料內容」</h2>



<p>在台灣，存取紀錄 (access log) 能否出境，主要取決於該紀錄是否包含<strong>機敏資料</strong>或<strong>個人資料</strong>，以及該單位是否為<strong>政府機關/關鍵基礎設施</strong>。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th class="has-text-align-left" data-align="left">情況 [1, 2, 3, 4, 5]</th><th class="has-text-align-left" data-align="left">是否可出境外</th><th class="has-text-align-left" data-align="left">法規要求與說明</th></tr><tr><td class="has-text-align-left" data-align="left"><strong>一般企業 (非特許產業)</strong></td><td class="has-text-align-left" data-align="left"><strong>原則允許</strong></td><td class="has-text-align-left" data-align="left">若 log 僅包含技術資訊（如 IP、timestamp），法律無明文禁止。若包含個資，則須符合《個資法》規範。</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>包含個人資料之 Log</strong></td><td class="has-text-align-left" data-align="left"><strong>有限制允許</strong></td><td class="has-text-align-left" data-align="left">根據 <a href="https://law.moj.gov.tw/LawClass/LawAll.aspx?pcode=I0050021">個人資料保護法</a> 第 21 條，主管機關得限制國際傳輸（如涉及國家安全、重大公共利益或受入國法律保護不足時）。</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>政府機關/公務機關</strong></td><td class="has-text-align-left" data-align="left"><strong>原則禁止/嚴格審核</strong></td><td class="has-text-align-left" data-align="left">公務機關之資通系統日誌應在地化保存為原則。涉及國家機密或機敏資料之處理，通常要求實體隔離或在地化儲存。</td></tr><tr><td class="has-text-align-left" data-align="left"><strong>金融、醫療等特許產業</strong></td><td class="has-text-align-left" data-align="left"><strong>需經核准/合規</strong></td><td class="has-text-align-left" data-align="left">相關產業使用雲端服務時，需遵循「金融機構使用雲端服務實務手冊」等準則，確保日誌能隨時供國內監管機構稽核。</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">實務合規建議</h2>



<ol class="wp-block-list">
<li><strong>日誌去識別化</strong>：若需將 access log 傳送到境外資安中心（如國外總部的 SOC 或 SIEM），應先過濾或遮蓋日誌中的敏感資訊（如姓名、身分證字號、非必要之個資欄位）。</li>



<li><strong>保留期限要求</strong>：根據《資通安全責任等級分級辦法》，核心資通系統之日誌應<strong>至少保留 6 個月</strong>，且需確保其完整性（防竄改）。</li>



<li><strong>雲端服務條款</strong>：若使用 Google Cloud、AWS 或 Azure 等境外雲端平台，應確認合約中關於資料存放地 (Data Residency) 的設定，並確認是否符合特定目的事業主管機關之規定。</li>



<li><strong>稽核義務</strong>：不論 Log 存放在何處，機關或企業必須保證當發生資安事件時，能及時提供完整日誌供主管機關調查。 [2, 5, 6, 7, 8]</li>
</ol>



<p>您的單位是否屬於 <strong>A、B、C 級資通安全責任等級</strong> 機關，或是 <strong>關鍵基礎設施 (CII)</strong> 提供者？這將決定您是否有更嚴格的在地化儲存義務。</p>



<p>[1] <a href="https://stellexlaw.com/taiwan-pdpa-data-breach-notification-72-hour-deadline-requirements/">https://stellexlaw.com</a></p>



<p>[2] <a href="https://pcw.tp.edu.tw/ischool/news/attached/25/12-11011%E8%B3%87%E5%AE%89%E9%9C%80%E6%B1%82.pdf">https://pcw.tp.edu.tw</a></p>



<p>[3] <a href="https://www.jcic.org.tw/main_ch/fileRename/fileRename.aspx?fid=1203&amp;kid=1">https://www.jcic.org.tw</a></p>



<p>[4] <a href="https://law.moea.gov.tw/NewsContent.aspx?id=135034#:~:text=%E4%B8%80%E3%80%81%E7%82%BA%E5%81%A5%E5%85%A8%E6%9C%AC%E9%83%A8%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%92%B0%E5%A2%83%EF%BC%8C%E5%BC%B7%E5%8C%96%E4%BA%BA%E5%93%A1%EF%BC%88%E5%90%AB%E9%A7%90%E9%BB%9E%E5%A4%96%E5%8C%85%E4%BA%BA%E5%93%A1%EF%BC%89%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E8%AA%8D%E7%9F%A5%EF%BC%8C%20%E9%98%B2%E6%AD%A2%E5%9B%A0%E4%BA%BA%E7%82%BA%E7%96%8F%E5%A4%B1%E8%80%8C%E5%B0%8E%E8%87%B4%E6%A9%9F%E6%95%8F%E8%B3%87%E6%96%99%E5%A4%96%E6%B4%A9%E7%AD%89%E6%83%85%E4%BA%8B%E7%99%BC%E7%94%9F%EF%BC%8C%E4%BB%A5%E7%A2%BA%E4%BF%9D%E5%90%84%E5%96%AE%E4%BD%8D%E9%9B%BB%E8%85%A6%E3%80%81%E8%B3%87%20%E6%96%99%E3%80%81%E7%B3%BB%E7%B5%B1%E5%8F%8A%E7%B6%B2%E8%B7%AF%E5%AE%89%E5%85%A8%EF%BC%8C%E7%89%B9%E8%A8%82%E5%AE%9A%E6%9C%AC%E9%A0%88%E7%9F%A5%E3%80%82%20%E4%BA%8C%E3%80%81%E6%A9%9F%E6%95%8F%E8%B3%87%E6%96%99%EF%BC%8C%E6%8C%87%E4%B8%8B%E5%88%97%E4%BA%8B%E9%A0%85%E3%80%81%E6%A5%AD%E5%8B%99%E5%8F%8A%E8%B3%87%E6%96%99%EF%BC%9A%20%28%E4%B8%80%29%E4%BE%9D%E6%B3%95%E8%A6%8F%E6%98%8E%E5%AE%9A%E4%B9%8B%E5%9C%8B%E5%AE%B6%E6%A9%9F%E5%AF%86%E4%BA%8B%E9%A0%85%E3%80%81%E4%B8%80%E8%88%AC%E5%85%AC%E5%8B%99%E6%A9%9F%E5%AF%86%E4%BA%8B%E9%A0%85%E3%80%82%20%28%E4%BA%8C%29%E5%90%84%E7%B4%9A%E4%B8%BB%E7%AE%A1%E6%8C%87%E7%A4%BA%E6%87%89%E4%BF%9D%E5%AF%86%E4%B9%8B%E6%95%8F%E6%84%9F%E6%80%A7%E6%A5%AD%E5%8B%99%E3%80%82%20%28%E4%B8%89%29%E6%89%BF%E8%BE%A6%E5%96%AE%E4%BD%8D%E6%88%96%E4%BA%BA%E5%93%A1%E5%B0%B1%E8%BE%A6%E7%90%86%E6%A5%AD%E5%8B%99%E8%80%83%E9%87%8F%EF%BC%8C%E8%AA%8D%E7%82%BA%E9%9C%80%E4%BF%9D%E5%AF%86%E4%B9%8B%E9%87%8D%E8%A6%81%E8%B3%87%E6%96%99%E3%80%82%20%E4%B8%89%E3%80%81%E5%AF%A6%E9%AB%94%E9%9A%94%E9%9B%A2%E4%BD%9C%E6%A5%AD%E9%A0%88%E7%9F%A5%20%28%E4%B8%80%29%E8%99%95%E7%90%86%E6%A9%9F%E6%95%8F%E8%B3%87%E6%96%99%E6%99%82%EF%BC%8C%E6%87%89%E4%BD%BF%E7%94%A8%E5%B0%88%E5%B1%AC%E5%AF%A6%E9%AB%94%E9%9A%94%E9%9B%A2%E9%9B%BB%E8%85%A6%E8%A8%AD%E5%82%99%E8%99%95%E7%90%86%E5%8F%8A%E5%88%97%E5%8D%B0%E3%80%82%20%28%E4%BA%8C%29%E5%84%B2%E5%AD%98%E6%A9%9F%E6%95%8F%E8%B3%87%E6%96%99%E4%B9%8B%E5%8F%AF%E6%94%9C%E5%BC%8F%E5%84%B2%E5%AD%98%E5%AA%92%E9%AB%94%E6%87%89%E4%B8%8A%E9%8E%96%E4%BF%9D%E7%AE%A1%EF%BC%8C%E4%B8%A6%E5%83%85%E9%99%90%E6%96%BC%E5%AF%A6%E9%AB%94%E9%9A%94%E9%9B%A2%E9%9B%BB%E8%85%A6%20%E8%AE%80%E5%8F%96%E3%80%81%E7%B9%95%E6%89%93%E5%8F%8A%E5%88%97%E5%8D%B0%E3%80%82%20%28%E4%B8%89%29%E5%AF%A6%E9%AB%94%E9%9A%94%E9%9B%A2%E9%9B%BB%E8%85%A6%E4%B8%8D%E5%BE%97%E7%A7%81%E8%87%AA%E9%80%A3%E6%8E%A5%E7%B6%B2%E8%B7%AF%E4%B8%A6%E4%B8%8D%E5%BE%97%E8%88%87%E4%B8%8A%E7%B6%B2%E9%9B%BB%E8%85%A6%E5%85%B1%E7%94%A8%E5%8D%B0%E8%A1%A8%E6%A9%9F%E3%80%82%20%28%E5%9B%9B%29%E5%AF%A6%E9%AB%94%E9%9A%94%E9%9B%A2%E9%9B%BB%E8%85%A6%E8%A3%BD%E5%A6%A5%E4%B9%8B%E6%96%87%E4%BB%B6%E5%A6%82%E9%9C%80%E7%B6%B2%E8%B7%AF%E5%82%B3%E8%BC%B8%E6%88%96%E5%BE%9E%E9%80%A3%E7%B6%B2%E9%9B%BB%E8%85%A6%E4%B8%8B%E8%BC%89%E6%96%87%E4%BB%B6%E8%A4%87%E8%A3%BD%E8%87%B3%20%E9%9A%94%E9%9B%A2%E9%9B%BB%E8%85%A6%E4%BD%BF%E7%94%A8%E6%99%82%EF%BC%8C%E6%87%89%E5%85%88%E5%B0%87%E6%96%87%E4%BB%B6%E8%A4%87%E8%A3%BD%E8%87%B3%E5%8F%AF%E6%94%9C%E5%BC%8F%E5%84%B2%E5%AD%98%E5%AA%92%E9%AB%94%EF%BC%8C%E5%86%8D%E7%A7%BB%E8%87%B3%E7%9B%AE%E7%9A%84%E9%9B%BB">https://law.moea.gov.tw</a></p>



<p>[5] <a href="https://www.ba.org.tw/FileDownload/Download?FileId=600d928f-0657-474f-b280-c2799421e682&amp;FileName=%E9%87%91%E8%9E%8D%E6%A9%9F%E6%A7%8B%E4%BD%BF%E7%94%A8%E9%9B%B2%E7%AB%AF%E6%9C%8D%E5%8B%99%E5%AF%A6%E5%8B%99%E6%89%8B%E5%86%8A%28%E5%90%AB%E5%B0%88%E6%9C%89%E5%90%8D%E8%A9%9E%E8%88%87%E6%AA%A2%E6%A0%B8%E8%A1%A8%29%E7%AC%AC%E4%B8%80%E7%89%88__113.08.pdf">https://www.ba.org.tw</a></p>



<p>[6] <a href="https://moda.gov.tw/ACS/laws/faq/04/638#:~:text=%E5%90%84%E6%A9%9F%E9%97%9C%E6%96%BC%E6%97%A5%E5%B8%B8%E7%B6%AD%E9%81%8B%E8%B3%87%E9%80%9A%E7%B3%BB%E7%B5%B1%E6%99%82%EF%BC%8C%E6%87%89%E8%A8%82%E5%AE%9A%E6%97%A5%E8%AA%8C%E4%B9%8B%E8%A8%98%E9%8C%84%E6%99%82%E9%96%93%E9%80%B1%E6%9C%9F%E5%8F%8A%E7%95%99%E5%AD%98%E6%94%BF%E7%AD%96%EF%BC%8C%E4%B8%A6%E4%BF%9D%E7%95%99%E6%97%A5%E8%AA%8C%E8%87%B3%E5%B0%916%E5%80%8B%E6%9C%88%EF%BC%8C%E5%85%B6%E4%BF%9D%E5%AD%98%E9%A0%85%E7%9B%AE%E5%BB%BA%E8%AD%B0%E5%A6%82%E4%B8%8B%EF%BC%9A%20%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1%E6%97%A5%E8%AA%8C%28OS%20event%20log%29%20%E7%B6%B2%E7%AB%99%E6%97%A5%E8%AA%8C%28web%20log%29%20%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F%E6%97%A5%E8%AA%8C%28AP%20log%29">https://moda.gov.tw</a></p>



<p>[7] <a href="https://dsp.twse.com.tw/public/static/downloads/brokerDepartment/%E8%B3%87%E9%80%9A%E7%B3%BB%E7%B5%B1%E5%AE%89%E5%85%A8%E9%98%B2%E8%AD%B7%E5%9F%BA%E6%BA%96%E5%8F%83%E8%80%83%E6%8C%87%E5%BC%95%E8%AA%AA%E6%98%8E_20220520090505.pdf">https://dsp.twse.com.tw</a></p>



<p>[8] <a href="https://law.moda.gov.tw/LawContent.aspx?id=FL089967#:~:text=%E7%AC%AC13%20%E6%A2%9D%E7%89%B9%E5%AE%9A%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E7%9F%A5%E6%82%89%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E4%BA%8B%E4%BB%B6%E5%BE%8C%EF%BC%8C%E6%87%89%E4%BE%9D%E4%B8%8B%E5%88%97%E8%A6%8F%E5%AE%9A%E6%99%82%E9%96%93%E5%AE%8C%E6%88%90%E6%90%8D%E5%AE%B3%E6%8E%A7%E5%88%B6%E6%88%96%E5%BE%A9%E5%8E%9F%E4%BD%9C%E6%A5%AD%EF%BC%8C%E4%B8%A6%E4%BE%9D%E4%B8%AD%E5%A4%AE%E7%9B%AE%E7%9A%84%E4%BA%8B%E6%A5%AD%E4%B8%BB%E7%AE%A1%E6%A9%9F%E9%97%9C%E6%8C%87%E5%AE%9A%E4%B9%8B%E6%96%B9%E5%BC%8F%E8%BE%A6%E7%90%86%E9%80%9A%E7%9F%A5%E4%BA%8B%E5%AE%9C%EF%BC%9A%20%E4%B8%80%E3%80%81%E7%AC%AC%E4%B8%80%E7%B4%9A%E6%88%96%E7%AC%AC%E4%BA%8C%E7%B4%9A%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E4%BA%8B%E4%BB%B6%EF%BC%8C%E6%96%BC%E7%9F%A5%E6%82%89%E8%A9%B2%E4%BA%8B%E4%BB%B6%E5%BE%8C%E4%B8%83%E5%8D%81%E4%BA%8C%E5%B0%8F%E6%99%82%E5%85%A7%E3%80%82%20%E4%BA%8C%E3%80%81%E9%87%8D%E5%A4%A7%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E4%BA%8B%E4%BB%B6%EF%BC%8C%E6%96%BC%E7%9F%A5%E6%82%89%E8%A9%B2%E4%BA%8B%E4%BB%B6%E5%BE%8C%E4%B8%89%E5%8D%81%E5%85%AD%E5%B0%8F%E6%99%82%E5%85%A7%E3%80%82">https://law.moda.gov.tw</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>是的，根據台灣法律與資安實務規範，<strong>公立大學（含國立、市立大學）在《資通安全管理法》與《個人資料保護法》的定義下，通常被視為「公務機關」</strong>。 [1, 2]</p>



<p>這意味著在處理 access log（存取紀錄）時，公立大學受到的限制遠比一般私人企業嚴格。以下為詳細分類與規範說明：</p>



<h2 class="wp-block-heading">1. 公立大學的法規身份</h2>



<ul class="wp-block-list">
<li><strong>資安法定位</strong>：公立學校被列為<strong>公務機關</strong>，必須遵守《資通安全管理法》及其子法。相對於此，私立大學通常被歸類為「特定非公務機關」。</li>



<li><strong>個資法定位</strong>：在個資法中，公立學校亦屬於公務機關，負有更高的個資保護與管理義務。 [2, 3, 4, 5]</li>
</ul>



<h2 class="wp-block-heading">2. 資通安全責任等級</h2>



<p>教育部已根據學校規模與業務性質，將各公立大學核定為不同的資安責任等級：</p>



<ul class="wp-block-list">
<li><strong>A 級 (最高)</strong>：教學醫院（如 台大醫院、<a href="https://www.hosp.ncku.edu.tw/">成大醫院</a>）或涉及國家安全機密研究的特定系所。</li>



<li><strong>B 級 (多數公立大學)</strong>：一般公立大學（如 <a href="https://www.ntu.edu.tw/">台灣大學</a>、<a href="https://www.nycu.edu.tw/">陽明交通大學</a>、<a href="https://www.nccu.edu.tw/">政治大學</a>）多被核定為 B 級機關。</li>



<li><strong>C 級</strong>：獨立學院或規模較小的專科學校。 [6, 7, 8, 9, 10]</li>
</ul>



<h2 class="wp-block-heading">3. Log 出境與存放之限制</h2>



<p>由於身分為「公務機關」，公立大學在處理 log 時須遵守以下規範：</p>



<ul class="wp-block-list">
<li><strong>禁止使用具資安疑慮產品</strong>：禁止使用大陸廠牌之資通訊產品處理公務資料或紀錄。</li>



<li><strong>在地化保存原則</strong>：公務機關的核心資通系統日誌以<strong>在地化保存</strong>為原則，特別是涉及機敏業務或個資的 log。</li>



<li><strong>國際傳輸限制</strong>：若欲將包含個資的 log 傳輸至境外（例如使用國外雲端 SIEM 服務），需符合 <a href="https://law.moj.gov.tw/LawClass/LawAll.aspx?pcode=I0050021">個人資料保護法</a> 第 21 條規定，且主管機關（教育部）有權限制此類國際傳輸。</li>



<li><strong>保存期限</strong>：B 級（含）以上機關之核心系統 log 應<strong>至少保存 6 個月</strong>，且需具備防竄改機制。 [3, 9, 11, 12, 13, 14]</li>
</ul>



<h2 class="wp-block-heading">總結建議</h2>



<p>若您在公立大學任職並計畫將 access log 傳送到境外：</p>



<ol class="wp-block-list">
<li><strong>確認系統等級</strong>：確認該 log 所屬系統是否為「核心資通系統」。</li>



<li><strong>去識別化處理</strong>：傳輸前務必過濾個資與機敏欄位。</li>



<li><strong>合約審查</strong>：若使用境外雲端服務，需確保符合教育部針對「委外辦理資通事項」的相關資安查核要求。</li>
</ol>



<p>您目前是需要將學校的 <strong>Web Log</strong> 還是 <strong>內部行政系統的 Log</strong> 傳送到境外的資安平台嗎？</p>



<p>[1] <a href="https://moda.gov.tw/ACS/laws/faq/01/632#:~:text=1.1.%20%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E6%B3%95%EF%BC%88%E4%BB%A5%E4%B8%8B%E7%B0%A1%E7%A8%B1%E8%B3%87%E5%AE%89%E6%B3%95%EF%BC%89%E4%B9%8B%E7%B4%8D%E7%AE%A1%E5%B0%8D%E8%B1%A1%E7%82%BA%E4%BD%95%EF%BC%9F%20%E8%B3%87%E5%AE%89%E6%B3%95%E7%B4%8D%E7%AE%A1%E5%B0%8D%E8%B1%A1%E5%8C%85%E5%90%AB%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E5%8F%8A%E7%89%B9%E5%AE%9A%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E3%80%82%20%E4%B8%80%E3%80%81%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%EF%BC%9A%E6%8C%87%E4%BE%9D%E6%B3%95%E8%A1%8C%E4%BD%BF%E5%85%AC%E6%AC%8A%E5%8A%9B%E4%B9%8B%E4%B8%AD%E5%A4%AE%E3%80%81%E5%9C%B0%E6%96%B9%E6%A9%9F%E9%97%9C%EF%BC%88%E6%A7%8B%EF%BC%89%E6%88%96%E5%85%AC%E6%B3%95%E4%BA%BA%EF%BC%8C%E4%BD%86%E4%B8%8D%E5%90%AB%E8%BB%8D%E4%BA%8B%E5%8F%8A%E6%83%85%E5%A0%B1%E6%A9%9F%E9%97%9C%E3%80%82%20%E4%BA%8C%E3%80%81%E7%89%B9%E5%AE%9A%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%EF%BC%9A%E6%8C%87%E9%97%9C%E9%8D%B5%E5%9F%BA%E7%A4%8E%E8%A8%AD%E6%96%BD%E6%8F%90%E4%BE%9B%E8%80%85%E3%80%81%E5%85%AC%E7%87%9F%E4%BA%8B%E6%A5%AD%E3%80%81%E7%89%B9%E5%AE%9A%E8%B2%A1%E5%9C%98%E6%B3%95%E4%BA%BA%E6%88%96%E5%8F%97%E6%94%BF%E5%BA%9C%E6%8E%A7%E5%88%B6%E4%B9%8B%E4%BA%8B%E6%A5%AD%E3%80%81%E5%9C%98%E9%AB%94%E6%88%96%E6%A9%9F%E6%A7%8B%E3%80%82">https://moda.gov.tw</a></p>



<p>[2] <a href="https://powilaw.com/%E7%B6%93%E9%A9%97%E5%88%86%E4%BA%AB/f/%E5%AD%B8%E6%A0%A1%E7%A9%B6%E7%AB%9F%E7%AE%97%E5%80%8B%E8%B3%87%E6%B3%95%E7%9A%84%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E9%82%84%E6%98%AF%E3%80%8C%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C">https://powilaw.com</a></p>



<p>[3] <a href="https://www.taccst.moe.edu.tw/announce/detail/38/#:~:text=%E6%9C%AC%E4%B8%AD%E5%BF%83%E8%88%87%E6%95%99%E8%82%B2%E6%A9%9F%E6%A7%8B%E8%B3%87%E5%AE%89%E9%A9%97%E8%AD%89%E4%B8%AD%E5%BF%83%E5%85%B1%E5%90%8C%E8%BE%A6%E7%90%86%E6%95%99%E8%82%B2%E9%83%A8109%2D110%E5%B9%B4%E5%BA%A6%E5%B0%8D%E6%89%80%E5%B1%AC%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E5%8F%8A%E6%89%80%E7%AE%A1%E7%89%B9%E5%AE%9A%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%A8%BD%E6%A0%B8%E8%A8%88%E7%95%AB%E8%AA%AA%E6%98%8E%E6%9C%83%EF%BC%8C%E7%9B%B8%E9%97%9C%E8%B3%87%E8%A8%8A%E5%A6%82%E4%B8%8B%EF%BC%9A.%20%E5%A3%B9%E3%80%81%E4%BE%9D%E6%93%9A:%20%E4%B8%80%E3%80%81%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E6%B3%95%E7%AC%AC13%E6%A2%9D%E7%AC%AC1%E9%A0%85%E5%8F%8A%E7%AC%AC17%E6%A2%9D%E7%AC%AC3%E9%A0%85%E3%80%82%20%E4%BA%8C%E3%80%81%E6%95%99%E8%82%B2%E9%83%A8%E6%89%80%E7%AE%A1%E7%89%B9%E5%AE%9A%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E4%BD%9C%E6%A5%AD%E8%BE%A6%E6%B3%95%E7%AC%AC5%E6%A2%9D%E7%AC%AC1%E9%A0%85%E3%80%82%20%E8%B2%B3%E3%80%81%E7%9B%AE%E7%9A%84:%20%E4%BE%9D%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E6%B3%95%E7%AC%AC13%E6%A2%9D%E7%AC%AC1%E9%A0%85%E5%8F%8A%E7%AC%AC17%E6%A2%9D%E7%AC%AC3%E9%A0%85%E8%A6%8F%E5%AE%9A%EF%BC%8C%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E6%87%89%E7%A8%BD%E6%A0%B8%E5%85%B6%E6%89%80%E5%B1%AC%E6%88%96%E7%9B%A3%E7%9D%A3%E6%A9%9F%E9%97%9C%E4%B9%8B%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%B6%AD%E8%AD%B7%E8%A8%88%E7%95%AB%E5%AF%A6%E6%96%BD%E6%83%85%E5%BD%A2%EF%BC%8C%E4%B8%AD%E5%A4%AE%E7%9B%AE%E7%9A%84%E4%BA%8B%E6%A5%AD%E4%B8%BB%E7%AE%A1%E6%A9%9F%E9%97%9C%E5%BE%97%E7%A8%BD%E6%A0%B8%E6%89%80%E7%AE%A1%E9%97%9C%E9%8D%B5%E5%9F%BA%E7%A4%8E%E8%A8%AD%E6%96%BD%E6%8F%90%E4%BE%9B%E8%80%85%E4%BB%A5%E5%A4%96%E4%B9%8B%E7%89%B9%E5%AE%9A%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%B6%AD%E8%AD%B7%E8%A8%88%E7%95%AB%E5%AF%A6%E6%96%BD%E6%83%85%E5%BD%A2%E3%80%82%E6%95%99%E8%82%B2%E9%83%A8%E7%82%BA%E8%90%BD%E5%AF%A6%E5%89%8D%E8%BF%B0%E6%B3%95%E4%BB%A4%E8%A6%8F%E5%AE%9A%EF%BC%8C%E8%A6%8F%E5%8A%83%E6%AF%8F%E5%B9%B4%E8%87%AA%E6%89%80%E5%B1%AC%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E5%8F%8A%E6%89%80%E7%AE%A1%E7%89%B9%E5%AE%9A%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E9%81%B8%E5%AE%9A%E5%8F%97%E7%A8%BD%E6%A0%B8%E5%B0%8D%E8%B1%A1%EF%BC%8C%E7%94%B1%E6%95%99%E8%82%B2%E6%A9%9F%E6%A7%8B%E8%B3%87%E5%AE%89%E9%A9%97%E8%AD%89%E4%B8%AD%E5%BF%83%E5%8D%94%E5%8A%A9%E8%BE%A6%E7%90%86%E5%89%8D%E9%96%8B%E7%A8%BD%E6%A0%B8%E4%BD%9C%E6%A5%AD%EF%BC%8C%E4%BB%A5%E5%8D%94%E5%8A%A9%E6%89%80%E5%B1%AC%E6%A9%9F%E9%97%9C%E3%80%81%E5%AD%B8%E6%A0%A1%E5%BC%B7%E5%8C%96%E8%B3%87%E5%AE%89%E9%98%B2%E8%AD%B7%E5%B7%A5%E4%BD%9C%E4%B9%8B%E5%AE%8C%E6%95%B4%E6%80%A7%E5%8F%8A%E6%9C%89%E6%95%88%E6%80%A7%EF%BC%8C%E4%B8%A6%E9%80%8F%E9%81%8E%E6%8C%81%E7%BA%8C%E6%94%B9%E5%96%84%E9%99%8D%E4%BD%8E%E8%B3%87%E5%AE%89%E9%A2%A8%E9%9A%AA%E3%80%82%20%E5%8F%83%E3%80%81%E8%BE%A6%E7%90%86%E5%96%AE%E4%BD%8D:%20%E4%B8%80%E3%80%81%E4%B8%BB%E8%BE%A6:%E6%95%99%E8%82%B2%E9%83%A8.">https://www.taccst.moe.edu.tw</a></p>



<p>[4] <a href="https://moda.gov.tw/ACS/laws/faq/01/632#:~:text=1.1.%20%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E6%B3%95%EF%BC%88%E4%BB%A5%E4%B8%8B%E7%B0%A1%E7%A8%B1%E8%B3%87%E5%AE%89%E6%B3%95%EF%BC%89%E4%B9%8B%E7%B4%8D%E7%AE%A1%E5%B0%8D%E8%B1%A1%E7%82%BA%E4%BD%95%EF%BC%9F%20%E8%B3%87%E5%AE%89%E6%B3%95%E7%B4%8D%E7%AE%A1%E5%B0%8D%E8%B1%A1%E5%8C%85%E5%90%AB%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E5%8F%8A%E7%89%B9%E5%AE%9A%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E3%80%82%20%E4%B8%80%E3%80%81%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%EF%BC%9A%E6%8C%87%E4%BE%9D%E6%B3%95%E8%A1%8C%E4%BD%BF%E5%85%AC%E6%AC%8A%E5%8A%9B%E4%B9%8B%E4%B8%AD%E5%A4%AE%E3%80%81%E5%9C%B0%E6%96%B9%E6%A9%9F%E9%97%9C%EF%BC%88%E6%A7%8B%EF%BC%89%E6%88%96%E5%85%AC%E6%B3%95%E4%BA%BA%EF%BC%8C%E4%BD%86%E4%B8%8D%E5%90%AB%E8%BB%8D%E4%BA%8B%E5%8F%8A%E6%83%85%E5%A0%B1%E6%A9%9F%E9%97%9C%E3%80%82%20%E4%BA%8C%E3%80%81%E7%89%B9%E5%AE%9A%E9%9D%9E%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%EF%BC%9A%E6%8C%87%E9%97%9C%E9%8D%B5%E5%9F%BA%E7%A4%8E%E8%A8%AD%E6%96%BD%E6%8F%90%E4%BE%9B%E8%80%85%E3%80%81%E5%85%AC%E7%87%9F%E4%BA%8B%E6%A5%AD%E3%80%81%E7%89%B9%E5%AE%9A%E8%B2%A1%E5%9C%98%E6%B3%95%E4%BA%BA%E6%88%96%E5%8F%97%E6%94%BF%E5%BA%9C%E6%8E%A7%E5%88%B6%E4%B9%8B%E4%BA%8B%E6%A5%AD%E3%80%81%E5%9C%98%E9%AB%94%E6%88%96%E6%A9%9F%E6%A7%8B%E3%80%82">https://moda.gov.tw</a></p>



<p>[5] <a href="https://www.pdpc.gov.tw/News_Html/100/">https://www.pdpc.gov.tw</a></p>



<p>[6] <a href="https://topu.nccu.edu.tw/project/index/q/category/21">https://topu.nccu.edu.tw</a></p>



<p>[7] <a href="https://www.tcrc.edu.tw/files/52/06.pdf">https://www.tcrc.edu.tw</a></p>



<p>[8] <a href="https://www.net.fju.edu.tw/file/ED-J-017.pdf">https://www.net.fju.edu.tw</a></p>



<p>[9] <a href="https://www.cc.ntu.edu.tw/chinese/epaper/0060/20220320_6001.html">https://www.cc.ntu.edu.tw</a></p>



<p>[10] <a href="https://it.nycu.edu.tw/it/ch/app/artwebsite/view?module=artwebsite&amp;id=5964&amp;serno=7a2e17f9-81eb-43bf-93eb-6e2e7178a14d">https://it.nycu.edu.tw</a></p>



<p>[11] <a href="https://www.hhps.kh.edu.tw/upload/14/101_50656/%E6%95%99%E8%82%B2%E9%AB%94%E7%B3%BB%E5%9B%A0%E6%87%89%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%AE%A1%E7%90%86%E6%B3%95%E4%B9%8B%E8%A6%8F%E5%8A%83%E8%AA%AA%E6%98%8E-108.01.21.pdf">https://www.hhps.kh.edu.tw</a></p>



<p>[12] <a href="https://lic.niu.edu.tw/p/404-1010-64054.php#:~:text=%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%94%A2%E5%93%81%E9%99%90%E5%88%B6%E4%BD%BF%E7%94%A8%E5%8E%9F%E5%89%87%E3%80%8D%EF%BC%8C%E4%B8%A6%E8%AB%8B%E4%BE%9D%E8%AA%AA%E6%98%8E%E8%BE%A6%E7%90%86%EF%BC%8C%E8%AB%8B%E6%9F%A5%E7%85%A7%E4%B8%A6%E8%BD%89%E7%9F%A5%E6%89%80%E5%B1%AC%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%EF%BC%88%E6%A7%8B%EF%BC%89%E3%80%82%20%E8%AA%AA%E6%98%8E%EF%BC%9A%20%E4%B8%80%E3%80%81%E7%82%BA%E9%81%BF%E5%85%8D%E5%85%AC%E5%8B%99%E5%8F%8A%E6%A9%9F%E6%95%8F%E8%B3%87%E6%96%99%E9%81%AD%E4%B8%8D%E7%95%B6%E7%AB%8A%E5%8F%96%EF%BC%8C%E5%B0%8E%E8%87%B4%E6%A9%9F%E9%97%9C%E6%A9%9F%E6%95%8F%E5%85%AC%E5%8B%99%E8%B3%87%E8%A8%8A%E5%A4%96%E6%B4%A9%E6%88%96%E9%80%A0%E6%88%90%E5%9C%8B%E5%AE%B6%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E5%8D%B1%E5%AE%B3%E9%A2%A8%E9%9A%AA%EF%BC%8C%E8%A1%8C%E6%94%BF%E9%99%A2%E5%89%8D%E5%B7%B2%E7%99%BC%E5%B8%83%E3%80%8C%E5%90%84%E6%A9%9F%E9%97%9C%E5%B0%8D%E5%8D%B1%E5%AE%B3%E5%9C%8B%E5%AE%B6%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%94%A2%E5%93%81%E9%99%90%E5%88%B6%E4%BD%BF%E7%94%A8%E5%8E%9F%E5%89%87%E3%80%8D%EF%BC%8C%E6%98%8E%E7%A2%BA%E8%A6%81%E6%B1%82%E4%B8%AD%E5%A4%AE%E8%88%87%E5%9C%B0%E6%96%B9%E6%A9%9F%E9%97%9C%EF%BC%88%E6%A7%8B%EF%BC%89%E3%80%81%E5%85%AC%E7%AB%8B%E5%AD%B8%E6%A0%A1%E3%80%81%E5%85%AC%E7%87%9F%E4%BA%8B%E6%A5%AD%E3%80%81%E8%A1%8C%E6%94%BF%E6%B3%95%E4%BA%BA%E4%BB%A5%E5%8F%8A%E8%87%AA%E8%A1%8C%E6%88%96%E5%A7%94%E5%A4%96%E7%87%9F%E9%81%8B%E6%8F%90%E4%BE%9B%E5%85%AC%E7%9C%BE%E6%B4%BB%E5%8B%95%E6%88%96%E4%BD%BF%E7%94%A8%E4%B9%8B%E5%A0%B4%E5%9C%B0%EF%BC%8C%E9%99%90%E5%88%B6%E4%BD%BF%E7%94%A8%E5%8D%B1%E5%AE%B3%E5%9C%8B%E5%AE%B6%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%94%A2%E5%93%81%EF%BC%8C%E4%B8%A6%E4%BB%A5%E8%A1%8C%E6%94%BF%E9%99%A2%E7%A7%98%E6%9B%B8%E9%95%B7109%E5%B9%B412%E6%9C%8818%E6%97%A5%E9%99%A2%E8%87%BA%E8%AD%B7%E9%95%B7%E5%AD%97%E7%AC%AC1090201804A%E8%99%9F%E5%87%BD%EF%BC%8C%E9%87%8D%E7%94%B3%E5%85%AC%E5%8B%99%E7%94%A8%E4%B9%8B%E8%B3%87%E9%80%9A%E8%A8%8A%E7%94%A2%E5%93%81%E4%B8%8D%E5%BE%97%E4%BD%BF%E7%94%A8%E5%A4%A7%E9%99%B8%E5%BB%A0%E7%89%8C%EF%BC%8C%E4%B8%94%E4%B8%8D%E5%BE%97%E5%AE%89%E8%A3%9D%E9%9D%9E%E5%85%AC%E5%8B%99%E7%94%A8%E8%BB%9F%E9%AB%94%E3%80%82%20%E4%BA%8C%E3%80%81%E7%82%BA%E5%9B%A0%E6%87%89%E6%96%B0%E5%9E%8B%E6%85%8B%E6%95%B8%E4%BD%8D%E6%9C%8D%E5%8B%99%E5%BB%B6%E4%BC%B8%E4%B9%8B%E6%96%B0%E8%88%88%E8%B3%87%E5%AE%89%E9%A2%A8%E9%9A%AA%EF%BC%8C%E5%86%8D%E6%AC%A1%E9%87%8D%E7%94%B3%E5%90%84%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E6%87%89%E9%81%B5%E5%BE%AA%E5%89%8D%E8%BF%B0%E8%A6%8F%E5%AE%9A%EF%BC%8C%E4%B8%A6%E8%AB%8B%E9%85%8D%E5%90%88%E8%BE%A6%E7%90%86%E4%BB%A5%E4%B8%8B%E4%BA%8B%E9%A0%85%EF%BC%9A%20%28%E4%B8%80%29%E5%85%AC%E5%8B%99%E7%94%A8%E4%B9%8B%E8%B3%87%E9%80%9A%E8%A8%8A%E7%94%A2%E5%93%81%E4%B8%8D%E5%BE%97%E4%BD%BF%E7%94%A8%E5%A4%A7%E9%99%B8%E5%BB%A0%E7%89%8C%EF%BC%8C%E4%B8%94%E4%B8%8D%E5%BE%97%E5%AE%89%E8%A3%9D%E9%9D%9E%E5%85%AC%E5%8B%99%E7%94%A8%E8%BB%9F%E9%AB%94%E3%80%82%20%28%E4%BA%8C%29%E5%90%84%E6%A9%9F%E9%97%9C%E6%87%89%E5%B0%B1%E5%B7%B2%E4%BD%BF%E7%94%A8%E6%88%96%E6%8E%A1%E8%B3%BC%E4%B9%8B%E5%A4%A7%E9%99%B8%E5%BB%A0%E7%89%8C%E8%B3%87%E9%80%9A%E8%A8%8A%E7%94%A2%E5%93%81%E5%88%97%E5%86%8A%E7%AE%A1%E7%90%86%EF%BC%8C%E4%B8%94%E4%B8%8D%E5%BE%97%E8%88%87%E5%85%AC%E5%8B%99%E7%92%B0%E5%A2%83%E4%BB%8B%E6%8E%A5%E3%80%82">https://lic.niu.edu.tw</a></p>



<p>[13] <a href="https://www.zzm.kh.edu.tw/view/index.php?WebID=81&amp;MainType=0&amp;SubType=101&amp;MainMenuId=31101&amp;SubMenuId=31670&amp;DataId=168571&amp;page=1&amp;Work=View#:~:text=%E4%B8%80%E3%80%81%E4%BE%9D%E6%93%9A%E5%B8%82%E5%BA%9C114%E5%B9%B44%E6%9C%887%E6%97%A5%E9%AB%98%E5%B8%82%E5%BA%9C%E7%A0%94%E8%B3%87%E5%AD%97%E7%AC%AC11401689300%E8%99%9F%E5%87%BD%E8%BE%A6%E7%90%86%E3%80%82%20%E4%BA%8C%E3%80%81%E7%82%BA%E9%81%BF%E5%85%8D%E5%85%AC%E5%8B%99%E5%8F%8A%E6%A9%9F%E6%95%8F%E8%B3%87%E6%96%99%E9%81%AD%E4%B8%8D%E7%95%B6%E7%AB%8A%E5%8F%96%EF%BC%8C%E5%B0%8E%E8%87%B4%E6%A9%9F%E9%97%9C%E6%A9%9F%E6%95%8F%E5%85%AC%E5%8B%99%E8%B3%87%E8%A8%8A%E5%A4%96%E6%B4%A9%E6%88%96%E9%80%A0%E6%88%90%E5%9C%8B%E5%AE%B6%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E5%8D%B1%E5%AE%B3%E9%A2%A8%E9%9A%AA%EF%BC%8C%E8%A1%8C%E6%94%BF%E9%99%A2%E5%89%8D%E5%B7%B2%E7%99%BC%E5%B8%83%E3%80%8C%E5%90%84%E6%A9%9F%E9%97%9C%E5%B0%8D%E5%8D%B1%E5%AE%B3%E5%9C%8B%E5%AE%B6%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%94%A2%E5%93%81%E9%99%90%E5%88%B6%E4%BD%BF%E7%94%A8%E5%8E%9F%E5%89%87%E3%80%8D%EF%BC%88%E5%A6%82%E9%99%84%E4%BB%B61%EF%BC%89%EF%BC%8C%E6%98%8E%E7%A2%BA%E8%A6%81%E6%B1%82%E4%B8%AD%E5%A4%AE%E8%88%87%E5%9C%B0%E6%96%B9%E6%A9%9F%E9%97%9C%EF%BC%88%E6%A7%8B%EF%BC%89%E3%80%81%E5%85%AC%E7%AB%8B%E5%AD%B8%E6%A0%A1%E3%80%81%E5%85%AC%E7%87%9F%E4%BA%8B%E6%A5%AD%E3%80%81%E8%A1%8C%E6%94%BF%E6%B3%95%E4%BA%BA%E4%BB%A5%E5%8F%8A%E8%87%AA%E8%A1%8C%E6%88%96%E5%A7%94%E5%A4%96%E7%87%9F%E9%81%8B%E6%8F%90%E4%BE%9B%E5%85%AC%E7%9C%BE%E6%B4%BB%E5%8B%95%E6%88%96%E4%BD%BF%E7%94%A8%E4%B9%8B%E5%A0%B4%E5%9C%B0%EF%BC%8C%E9%99%90%E5%88%B6%E4%BD%BF%E7%94%A8%E5%8D%B1%E5%AE%B3%E5%9C%8B%E5%AE%B6%E8%B3%87%E9%80%9A%E5%AE%89%E5%85%A8%E7%94%A2%E5%93%81%EF%BC%8C%E4%B8%A6%E4%BB%A5%E8%A1%8C%E6%94%BF%E9%99%A2%E7%A7%98%E6%9B%B8%E9%95%B7109%E5%B9%B412%E6%9C%8818%E6%97%A5%E9%99%A2%E8%87%BA%E8%AD%B7%E9%95%B7%E5%AD%97%E7%AC%AC1090201804A%E8%99%9F%E5%87%BD%EF%BC%8C%E9%87%8D%E7%94%B3%E5%85%AC%E5%8B%99%E7%94%A8%E4%B9%8B%E8%B3%87%E9%80%9A%E8%A8%8A%E7%94%A2%E5%93%81%E4%B8%8D%E5%BE%97%E4%BD%BF%E7%94%A8%E5%A4%A7%E9%99%B8%E5%BB%A0%E7%89%8C%EF%BC%8C%E4%B8%94%E4%B8%8D%E5%BE%97%E5%AE%89%E8%A3%9D%E9%9D%9E%E5%85%AC%E5%8B%99%E7%94%A8%E8%BB%9F%E9%AB%94%E3%80%82%20%E4%B8%89%E3%80%81%E7%82%BA%E5%9B%A0%E6%87%89%E6%96%B0%E5%9E%8B%E6%85%8B%E6%95%B8%E4%BD%8D%E6%9C%8D%E5%8B%99%E5%BB%B6%E4%BC%B8%E4%B9%8B%E6%96%B0%E8%88%88%E8%B3%87%E5%AE%89%E9%A2%A8%E9%9A%AA%EF%BC%8C%E5%86%8D%E6%AC%A1%E9%87%8D%E7%94%B3%E5%90%84%E5%85%AC%E5%8B%99%E6%A9%9F%E9%97%9C%E6%87%89%E9%81%B5%E5%BE%AA%E5%89%8D%E8%BF%B0%E8%A6%8F%E5%AE%9A%EF%BC%8C%E4%B8%A6%E8%AB%8B%E5%AD%B8%E6%A0%A1%E9%85%8D%E5%90%88%E8%BE%A6%E7%90%86%E4%BB%A5%E4%B8%8B%E4%BA%8B%E9%A0%85%EF%BC%9A%20%28%E4%B8%80%29%E5%85%AC%E5%8B%99%E7%94%A8%E4%B9%8B%E8%B3%87%E9%80%9A%E8%A8%8A%E7%94%A2%E5%93%81%E4%B8%8D%E5%BE%97%E4%BD%BF%E7%94%A8%E5%A4%A7%E9%99%B8%E5%BB%A0%E7%89%8C%EF%BC%8C%E4%B8%94%E4%B8%8D%E5%BE%97%E5%AE%89%E8%A3%9D%E9%9D%9E%E5%85%AC%E5%8B%99%E7%94%A8%E8%BB%9F%E9%AB%94%E3%80%82%20%28%E4%BA%8C%29%E5%AD%B8%E6%A0%A1%E6%87%89%E5%B0%B1%E5%B7%B2%E4%BD%BF%E7%94%A8%E6%88%96%E6%8E%A1%E8%B3%BC%E4%B9%8B%E5%A4%A7%E9%99%B8%E5%BB%A0%E7%89%8C%E8%B3%87%E9%80%9A%E8%A8%8A%E7%94%A2%E5%93%81%E5%88%97%E5%86%8A%EF%BC%8C%E4%B8%A6%E7%94%B1%E5%B0%88%E4%BA%BA%E7%AE%A1%E7%90%86%EF%BC%8C%E4%B8%94%E4%B8%8D%E5%BE%97%E8%88%87%E5%85%AC%E5%8B%99%E7%92%B0%E5%A2%83%E4%BB%8B%E6%8E%A5%E3%80%82">https://www.zzm.kh.edu.tw</a></p>



<p>[14] <a href="https://www.pdpc.gov.tw/News_Html/100/">https://www.pdpc.gov.tw</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>針對公立大學的 <strong>Web Log</strong>（網頁伺服器存取紀錄）傳輸至境外，雖然其性質通常比行政系統紀錄（如人事、薪資）稍微不敏感，但身為<strong>公務機關</strong>，仍須遵循以下實務規範：</p>



<h2 class="wp-block-heading">1. 核心判斷：是否包含「個資」或「帳號」？</h2>



<ul class="wp-block-list">
<li><strong>純技術 Log</strong>：如果 Log 僅包含 <code>來源 IP</code>、<code>訪問時間</code>、<code>URL 路徑</code>、<code>HTTP 狀態碼</code>、<code>User-Agent</code>，在現行法規下通常被視為技術資訊。這類資訊傳輸至境外（如使用 Cloudflare, Akamai 或國外資安監控中心）的門檻較低。</li>



<li><strong>含個資 Log</strong>：若 URL 參數中包含 <strong>身分證字號</strong>、<strong>學號</strong>、<strong>姓名</strong>（例如：<code>GET /profile?id=A123456789</code>），或 Log 紀錄了 <strong>使用者帳號</strong>，這就涉及《個資法》的「國際傳輸」。身為公立大學（公務機關），應盡量避免這類資訊出境。</li>
</ul>



<h2 class="wp-block-heading">2. 教育部與資安法之要求</h2>



<p>根據《資通安全管理法》及教育部對公立學校的指導原則：</p>



<ul class="wp-block-list">
<li><strong>優先在地儲存</strong>：核心資通系統（如校務系統入口、首頁）的原始日誌（Raw Logs）應在校園內部或國內儲存空間備份至少 <strong>6 個月</strong>。</li>



<li><strong>境外傳輸前置作業</strong>：若要將 Web Log 送往境外的 SIEM 或分析平台，建議先在校內進行 <strong>去識別化 (Anonymization/Masking)</strong>，將學號或敏感參數遮蓋後再外傳。</li>
</ul>



<h2 class="wp-block-heading">3. 禁止使用「危害國家資通安全產品」</h2>



<p>這是公立大學最嚴格的紅線：</p>



<ul class="wp-block-list">
<li><strong>禁止名單</strong>：絕對不能將 Log 傳輸至<strong>中國大陸廠牌</strong>的雲端空間或使用其資安分析服務（如阿里雲、華為雲等），這違反行政院及教育部的資安規定。</li>



<li><strong>合格供應商</strong>：使用如 Google (GCP)、Amazon (AWS) 或 Microsoft (Azure) 等美商雲端，且選擇台灣或鄰近非紅區節點，是目前較常見且合規的作法。</li>
</ul>



<h2 class="wp-block-heading">4. 實務操作建議</h2>



<p>若您計畫將 Web Log 傳送到境外資安分析平台：</p>



<ol class="wp-block-list">
<li><strong>確認合約</strong>：確保服務供應商（如 CDN 或 WAF 服務商）符合資安法規要求，且有提供資料安全保護協議。</li>



<li><strong>稽核準備</strong>：確保當教育部或資通安全署進行資安稽核時，您能在校內調取出「完整、未經過境外過濾」的原始日誌。</li>



<li><strong>隱私宣告</strong>：在大學官網的「隱私權政策」中，應載明會蒐集存取紀錄，並可能用於資安防護目的。</li>
</ol>



<p>您是打算使用 <strong>境外 CDN/WAF（如 Cloudflare）</strong>，還是要將 Log 匯入到 <strong>國外的總部或第三方分析軟體</strong> 中？不同的使用情境，對合規文件的要求也會有所不同。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>若您是公立大學（公務機關），計畫將 <strong>Web Log</strong> 匯入 <strong>Azure Monitor (Log Analytics)</strong>，主要會涉及「資料儲存地」與「公務雲端規範」兩大重點。</p>



<p>以下是針對您的情境（Azure 境外分析）的具體合規分析與建議：</p>



<h2 class="wp-block-heading">1. Azure 資料駐留 (Data Residency) 的選擇</h2>



<p>Azure 雖然是境外廠商，但他在台灣已有資料中心。</p>



<ul class="wp-block-list">
<li><strong>建議做法</strong>：在建立 Log Analytics Workspace 時，區域（Region）請優先選擇 <strong>Taiwan North (台灣北部)</strong>。</li>



<li><strong>合規意義</strong>：若 Log 儲存在台灣本地節點，則不屬於「資料出境」，可直接規避《個資法》第 21 條關於國際傳輸的複雜限制，也最符合教育部對公務機關「資料在地化」的期待。</li>
</ul>



<h2 class="wp-block-heading">2. 若必須傳輸至國外區域（如 East US 或 Singapore）</h2>



<p>若因特定功能或預算考量需傳往國外，公立大學須滿足以下條件：</p>



<ul class="wp-block-list">
<li><strong>個資去識別化</strong>：在 Log 發送至 Azure 之前，應透過 Azure Monitor Agent (AMA) 的 <strong>資料收集規則 (DCR)</strong> 或中繼伺服器，將 URL 參數中的學號、身分證字號或使用者帳號進行 <code>Hashing</code> 或 <code>Masking</code>（遮罩）。</li>



<li><strong>排除具資安疑慮之廠商</strong>：Azure 屬美商，符合行政院針對公務機關使用雲端服務的合格供應商範疇（非大陸廠牌）。</li>
</ul>



<h2 class="wp-block-heading">3. 遵守《資通安全管理法》子法規範</h2>



<p>身為 B 級（或以上）機關，將 Web Log 匯入 Azure 時需確保：</p>



<ul class="wp-block-list">
<li><strong>完整性與防竄改</strong>：Azure Log Analytics 具備唯讀特性，符合資安法對日誌不可竄改的要求。</li>



<li><strong>備份義務</strong>：法律要求 Log 需保存 <strong>6 個月</strong>。雖然 Azure 可以設定保留期，但建議校內仍需留有一份原始 Log 備份，以應付教育部或資安署的實地稽核。</li>



<li><strong>委外資安稽核</strong>：公立大學將資通業務委外處理（使用雲端算委外的一種），應每年對受託資服商進行資安稽核。實務上通常以查閱微軟提供的 <strong>合規性報告 (Compliance Reports, 如 SOC 2)</strong> 代替實地查核。</li>
</ul>



<h2 class="wp-block-heading">4. 實務操作風險提醒</h2>



<ul class="wp-block-list">
<li><strong>IP 位址爭議</strong>：雖然 IP 位址在台灣目前的法律實務中，對於是否屬於「個資」仍有討論空間，但在公務機關的嚴格標準下，建議將 IP 的最後一碼（Last Octet）遮蓋後再傳往境外區域，可大幅降低合規壓力。</li>
</ul>



<p><strong>總結建議：</strong><br>最省事的合規方式是將 Azure Log Analytics Workspace 建立在 <strong>台灣區域 (Taiwan North)</strong>。若必須放在國外，請務必先在校內端完成 <strong>敏感欄位遮蓋</strong>。</p>



<p>您目前預計匯入的 Log 數量大嗎？是否需要針對 <strong>自動化遮蓋敏感資訊</strong> 的技術設定提供建議？</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>這確實是目前許多單位在評估 <strong>Taiwan North (台灣北部)</strong> 節點時會遇到的典型問題：<strong>「資料在地化」與「服務完整度」的衝突</strong>。</p>



<p>既然因為 <code>Container Apps</code> 的技術限制必須使用境外區域（例如 <code>East Asia</code> 香港或 <code>Southeast Asia</code> 新加坡），針對公立大學（公務機關）的身份，您可以採取以下<strong>合規路徑</strong>來處理 Web Log：</p>



<h2 class="wp-block-heading">1. 採取「混合式」日誌架構 (最推薦)</h2>



<p>不要直接將原始 Log 從 Container Apps 丟往境外的 Log Analytics。</p>



<ul class="wp-block-list">
<li><strong>做法</strong>：在 Container Apps 輸出的流量中，先經過一個位於校內（或國內雲端 VM）的 <strong>中繼站 (Forwarder/Collector)</strong>，例如 Fluentd 或 OpenTelemetry。</li>



<li><strong>關鍵動作</strong>：在中繼站進行 <strong>去識別化 (De-identification)</strong>。
<ul class="wp-block-list">
<li>遮蓋 URL 中的敏感字串（學號、姓名）。</li>



<li>將來源 IP 去標籤（例如 192.168.1.100 改為 192.168.1.x）。</li>
</ul>
</li>



<li><strong>合規點</strong>：傳出國外的資料已不具備「個資」屬性，這對教育部和稽核單位來說，合規壓力會降到最低。</li>
</ul>



<h2 class="wp-block-heading">2. 完備「委外資安」行政手續</h2>



<p>依據《資通安全管理法》子法，公立大學將資通業務（含 Log 存儲）委外給 Azure 時，應履行以下行政程序：</p>



<ul class="wp-block-list">
<li><strong>受託對象安全性</strong>：Azure (Microsoft) 屬非大陸廠牌，過關。</li>



<li><strong>資料國際傳輸聲明</strong>：在校內資安會議或公文中，敘明因技術限制（Taiwan North 尚無該功能），資料暫存於國外節點，並已實施去識別化措施。</li>



<li><strong>下載 SOC 報告</strong>：從 <a href="https://servicetrust.microsoft.com/">Microsoft Service Trust Portal</a> 下載最新的 <strong>SOC 1/2</strong> 或 <strong>ISO 27001</strong> 報告存檔，證明該區域已通過國際資安標準。</li>
</ul>



<h2 class="wp-block-heading">3. 設定「異地備援」至校內</h2>



<p>即便分析是在境外的 Azure Monitor 進行，法律要求的「6 個月日誌保存」建議還是要有一份在校內。</p>



<ul class="wp-block-list">
<li><strong>做法</strong>：將 Log 同時導流一份回校內的伺服器儲存。</li>



<li><strong>合規點</strong>：若資安署或教育稽核要看「原始原始碼（Raw Log）」，您可以出示校內這份。境外那份僅定義為「分析用途」，而非「唯一保存地」。</li>
</ul>



<h2 class="wp-block-heading">4. 實務折衷方案：選用「新加坡」優於「香港」</h2>



<p>若必須選境外：</p>



<ul class="wp-block-list">
<li><strong>優先選 Southeast Asia (新加坡)</strong>：政治風險相對較低，且與台灣網路連線品質優。</li>



<li><strong>避免 East Asia (香港)</strong>：雖然連線快，但因《國安法》等因素，部分公務機關在資安稽核時對香港區域的資料存放會更為敏感。</li>
</ul>



<p><strong>總結建議：</strong><br>既然技術上非出國不可，請務必在 Log 送入 Azure 之前，先在校園端過濾掉<strong>明文個資</strong>。只要 Log 裡沒有「可辨識特定人」的資料，它就是純粹的「技術數據」，出境的爭議會小很多。</p>



<p>您目前的 Container Apps 是要處理 <strong>校內行政系統</strong> 的 Web 流量，還是 <strong>一般學術研究/宣傳型</strong> 的網站？（後者的敏感度較低，處理起來會更彈性）</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/taiwan-access-log-overseas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>App Service (Web App) 轉向 Azure Container Apps (ACA) 完整 CLI 指令</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/azure-web-app-to-aca/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/azure-web-app-to-aca/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 09:59:18 +0000</pubDate>
				<category><![CDATA[Azure 筆記]]></category>
		<category><![CDATA[azure]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8319</guid>

					<description><![CDATA[整理了從建立 Resource Group 到佈...]]></description>
										<content:encoded><![CDATA[
<p>整理了從建立 Resource Group 到佈署 ACA 的完整 CLI 指令。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">第一部分：Azure CLI 指令集</h3>



<p>請確保你的 Azure CLI 已安裝 <code>containerapp</code> 擴充功能：<code>az extension add --name containerapp</code>。</p>



<h4 class="wp-block-heading">1. 建立資源群組 (Resource Group)</h4>



<p>Bash</p>



<pre class="wp-block-code"><code>az group create \
  --name my-aca-rg \
  --location taiwannorth
</code></pre>



<h4 class="wp-block-heading">2. 建立 Log Analytics 工作區</h4>



<p>ACA 需要一個工作區來儲存日誌。</p>



<p>Bash</p>



<pre class="wp-block-code"><code>az monitor log-analytics workspace create \
  --resource-group my-aca-rg \
  --workspace-name my-aca-logs \
  --location taiwannorth
</code></pre>



<h4 class="wp-block-heading">3. 建立 Container Apps Environment</h4>



<p>這是 ACA 的基礎設施邊界。根據你的需求，我們不設定 VNet 整合。</p>



<p>Bash</p>



<pre class="wp-block-code"><code>az containerapp env create \
  --name my-aca-env \
  --resource-group my-aca-rg \
  --logs-workspace my-aca-logs \
  --location taiwannorth
</code></pre>



<h4 class="wp-block-heading">4. 佈署 Container App</h4>



<p>假設你的映像檔在 Docker Hub 或公共倉庫（若是私有倉庫如 ACR，則需額外參數）。</p>



<p>Bash</p>



<pre class="wp-block-code"><code>az containerapp create \
  --name my-web-app \
  --resource-group my-aca-rg \
  --environment my-aca-env \
  --image mcr.microsoft.com/k8se/quickstart:latest \
  --target-port 80 \
  --ingress external \
  --query properties.configuration.ingress.fqdn
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">第二部分：關於「不連內網」與「其他服務整合」</h3>



<p>你的需求是 <strong>「不需連內網 (VNet)」</strong>，這在 ACA 中被稱為 <strong>Managed Environment</strong>。</p>



<h4 class="wp-block-heading">1. 這是否會影響與其他 Azure 服務的溝通？</h4>



<p><strong>不會。</strong> 即使不加入自定義 VNet，ACA 預設就能透過 <strong>公用端點 (Public Endpoint)</strong> 與其他 Azure 服務溝通，例如：</p>



<ul class="wp-block-list">
<li><strong>Azure SQL / Cosmos DB：</strong> 透過公用存取或防火牆白名單連接。</li>



<li><strong>Blob Storage：</strong> 透過 SDK 直接存取。</li>



<li><strong>Static Web Apps (SWA)：</strong> 這兩者經常搭配使用。</li>
</ul>



<h4 class="wp-block-heading">2. 與「靜態網頁 (Static Web Apps)」的整合場景</h4>



<p>這是一個非常經典的架構：</p>



<ul class="wp-block-list">
<li><strong>前端：</strong> 使用 <strong>Azure Static Web Apps</strong> 佈署 React/Vue/Angular。它全球佈署，速度快且成本極低。</li>



<li><strong>後端：</strong> 使用 <strong>Azure Container Apps</strong> 作為 API Server 或處理複雜邏輯。</li>



<li><strong>串接方式：</strong> 1. 你可以在 SWA 的設定中，將 ACA 的 FQDN 設定為 API 的來源。2. 利用 SWA 的 <strong>&#8220;Bring your own backend&#8221; (BYOB)</strong> 功能，將 ACA 連結到 SWA，這樣前端請求 <code>/api</code> 時，Azure 會自動路由到你的 ACA，且不需要處理跨網域 (CORS) 問題。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">補充建議</h3>



<ul class="wp-block-list">
<li><strong>成本控制：</strong> ACA 的優勢在於可以「縮減至 0 (Scale to Zero)」，如果你的服務不是 24/7 都有流量，這比 Web App 便宜非常多。</li>



<li><strong>安全性：</strong> 既然不使用 VNet，建議在 ACA 內啟用 <strong>Managed Identity (受控識別)</strong> 來存取 Key Vault 或資料庫，這樣就不需要在程式碼裡寫死密碼。</li>
</ul>



<p>你的 Web App 目前是跑什麼樣的程式語言？如果涉及私有映像檔倉庫（如 ACR），我再幫你補上相關的認證指令。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">佈署 Container App, 只能用 http (port:80) 不能用 https 連?</h2>



<p>在 Azure Container Apps (ACA) 中，關於連線協議的設計非常明確：<strong>對外（Ingress）強制使用 HTTPS</strong>，而<strong>內部（Container 之間）則可以使用 HTTP</strong>。</p>



<p>以下是針對你疑問的詳細拆解：</p>



<h3 class="wp-block-heading">1. 對外連線：強制 HTTPS</h3>



<p>當你將 <code>ingress</code> 設定為 <code>external</code> 時，Azure 會自動為你的 Container App 提供一個預設的 FQDN（例如 <code>my-app.taiwannorth.azurecontainerapps.io</code>），並且：</p>



<ul class="wp-block-list">
<li><strong>自動處理 SSL/TLS 憑證：</strong> Azure 會自動管理並為該網址簽發憑證。</li>



<li><strong>強制導向：</strong> 預設情況下，所有來自外部的 <strong>HTTP (Port 80)</strong> 請求都會被<strong>自動轉址 (Redirect) 到 HTTPS (Port 443)</strong>。</li>



<li><strong>安全性：</strong> 你不需要在容器內部處理複雜的憑證設定，這些都在 ACA 的邊界（Ingress）層級處理掉了。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 內部通訊：可以使用 HTTP</h3>



<p>雖然外部使用者必須透過 HTTPS 連線，但你的 <strong>容器內部（Container Port）</strong> 通常只需要監聽 HTTP 即可。</p>



<ul class="wp-block-list">
<li><strong>SSL Termination (SSL 卸載)：</strong> 流量到達 ACA 環境的入口時，HTTPS 會被「卸載」。接著，ACA 的負載平衡器會透過 <strong>HTTP</strong> 將流量轉發給你的容器。</li>



<li><strong>指令中的 <code>--target-port 80</code>：</strong> 這就是告訴 ACA，你的程式碼在容器內監聽的是 Port 80。</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>[!TIP]</p>



<p><strong>結論：</strong> 使用者訪問你的網址時「一定是用 https」，但你寫程式時，只要讓 App 監聽 http port 就可以了。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 如果你想更動 Ingress 設定</h3>



<p>如果你希望調整，以下是相關的指令邏輯：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>需求</strong></td><td><strong>指令參數</strong></td><td><strong>說明</strong></td></tr></thead><tbody><tr><td><strong>開放給所有人</strong></td><td><code>--ingress external</code></td><td>提供 HTTPS 公開網址。</td></tr><tr><td><strong>僅限環境內溝通</strong></td><td><code>--ingress internal</code></td><td>只有同個 ACA Environment 內的服務可互連，不對外。</td></tr><tr><td><strong>指定容器監聽 Port</strong></td><td><code>--target-port 8080</code></td><td>如果你的 App 跑在 8080，請務必對應。</td></tr><tr><td><strong>傳輸協議</strong></td><td><code>--transport http</code></td><td>預設為 http，支援 http2 或 grpc。</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 與靜態網頁 (Static Web App) 串接時的 HTTPS</h3>



<p>既然你提到可能配合「靜態網頁」使用：</p>



<ul class="wp-block-list">
<li><strong>Static Web Apps</strong> 同樣強制 HTTPS。</li>



<li>由於兩者都是 HTTPS，在瀏覽器端發送 API 請求時，不會遇到「混合內容 (Mixed Content)」的安全警告。</li>
</ul>



<p><strong>最後一個小提醒：</strong></p>



<p>在 <code>taiwannorth</code> (台北) 部署時，請確認你的 CLI 版本是最新的，因為新區域的資源類型有時需要最新版的 API 支援。</p>



<p>你的程式碼是使用特定的框架（如 .NET, Node.js, Python）嗎？我可以幫你確認該框架預設的 Port 是否需要調整。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">&#8211;target-port 參數要換成 443?</h2>



<p>不需要。在 <code>--target-port</code> 參數中，你<strong>應該維持設定為你的程式（容器）真正監聽的 Port</strong>（通常是 80, 8080 或 5000），而不是 443。</p>



<p>這裡有一個關鍵觀念：<strong>ACA 的 Ingress 層會幫你做「SSL 卸載 (SSL Termination)」。</strong></p>



<h3 class="wp-block-heading">為什麼不填 443？</h3>



<ol start="1" class="wp-block-list">
<li><strong>流量轉發流程：</strong>
<ul class="wp-block-list">
<li><strong>外部使用者</strong>：透過 <code>https://...</code> (Port 443) 訪問你的 FQDN。</li>



<li><strong>ACA Ingress 控制器</strong>：接收 HTTPS 流量，處理 SSL 憑證，解密後將流量轉為 <strong>HTTP</strong>。</li>



<li><strong>你的容器</strong>：接收來自 Ingress 轉發的 <strong>HTTP</strong> 流量。</li>
</ul>
</li>



<li><strong>容器內部配置：</strong>大多數 Docker 映像檔（例如 Nginx, Node.js, Python）在容器內預設都是跑 HTTP (Port 80/8080)。如果你強行設定 <code>--target-port 443</code>，ACA 會試圖把流量導向容器的 443 Port，但如果你的程式沒在該 Port 監聽或沒配置憑證，連線就會失敗。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">指令情境建議</h3>



<ul class="wp-block-list">
<li><strong>如果你的程式碼監聽 80 (如 Nginx 預設)：</strong>Bash<code>--target-port 80</code></li>



<li><strong>如果你的程式碼監聽 8080 (如 Spring Boot 或許多 Node.js 框架)：</strong>Bash<code>--target-port 8080</code></li>



<li><strong>只有在一種極罕見的情況下才用 443：</strong>除非你自己把 SSL 憑證打包進 Docker Image 裡，並且讓你的程式碼直接監聽 443 Port 並處理加密（這在雲端原生架構中不建議，因為管理憑證很麻煩）。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">總結</h3>



<p>外部連線時，Azure 會<strong>強制幫你加密</strong>，所以使用者看到的絕對是 <code>https://</code>。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>驗證方法：</strong></p>



<p>部署完成後，你可以試著在瀏覽器輸入 <code>http://&lt;你的網址&gt;</code>，你會發現它會自動跳轉成 <code>https://&lt;你的網址&gt;</code>。這證明了 HTTPS 是在「入口處」就處理好的，跟你的 <code>--target-port</code> 設定無關。</p>
</blockquote>



<p>目前你的 Web App 程式碼裡面，監聽的是哪個 Port 呢？</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/azure-web-app-to-aca/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>測試台灣連 japan east / 新加坡反應時間</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/azure-japan-east-response-time/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/azure-japan-east-response-time/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 09:49:59 +0000</pubDate>
				<category><![CDATA[Azure 筆記]]></category>
		<category><![CDATA[azure]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8313</guid>

					<description><![CDATA[power shell 腳本, 請直接複製執行這...]]></description>
										<content:encoded><![CDATA[
<p>power shell 腳本, 請直接複製執行這兩段指令：</p>



<h3 class="wp-block-heading">1. 實測新加坡速度 (Southeast Asia)</h3>



<p>PowerShell</p>



<pre class="wp-block-code"><code>$time = Measure-Command { $socket = New-Object Net.Sockets.TcpClient; $socket.Connect("20.195.69.73", 443); $socket.Close() }
Write-Host "新加坡 (Southeast Asia) 回應時間: $($time.TotalMilliseconds) ms"
</code></pre>



<h3 class="wp-block-heading">2. 實測日本東部速度 (Japan East)</h3>



<p>PowerShell</p>



<pre class="wp-block-code"><code>$time = Measure-Command { $socket = New-Object Net.Sockets.TcpClient; $socket.Connect("20.43.64.106", 443); $socket.Close() }
Write-Host "日本東部 (Japan East) 回應時間: $($time.TotalMilliseconds) ms"</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>執行結果:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="321" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-46-5m-1024x321.jpg?v=1776764857" alt="" class="wp-image-8314" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-46-5m-1024x321.jpg?v=1776764857 1024w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-46-5m-600x188.jpg?v=1776764857 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-46-5m-768x241.jpg?v=1776764857 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-46-5m-1536x482.jpg?v=1776764857 1536w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-46-5m-2048x643.jpg?v=1776764857 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>數據出來了，結果非常明確：<strong>日本東部 (Japan East) 的物理連線速度明顯優於新加坡</strong>，快了將近 <strong>27ms</strong> (約 40%)。</p>



<p>在網路環境下，42ms 是一個非常漂亮的速度。既然日本區的 TCP 連線反應更快，我們就選 <strong><code>japaneast</code></strong>。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">最終決定：使用 Japan East (日本東部)</h3>



<p>雖然它比較快，但因為你的環境 DNS 解析不穩，建議你在執行 Azure 指令前，先確保你的環境能正確解析網域名稱。</p>



<p><strong>解決 DNS 不穩的小技巧：</strong> 如果你之後又遇到 <code>Name resolution failed</code>，請將你的電腦 DNS 暫時手動設定為 <code>8.8.8.8</code> (Google) 或 <code>1.1.1.1</code> (Cloudflare)，這通常能解決學術網路對部分 Azure 區域解析不良的問題。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/azure-japan-east-response-time/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Azure 的 Log Analytics Workspace</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/azure-log-analytics-workspace/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/azure-log-analytics-workspace/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 09:44:29 +0000</pubDate>
				<category><![CDATA[Azure 筆記]]></category>
		<category><![CDATA[azure]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8310</guid>

					<description><![CDATA[在 Azure 中，Log Analytics ...]]></description>
										<content:encoded><![CDATA[
<p>在 Azure 中，<strong>Log Analytics Workspace</strong> 是屬於 <code>monitor</code> 指令集的一部分。要建立它，你需要使用 <code>az monitor log-analytics workspace create</code>。</p>



<p>以下是完整的建立步驟與語法：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1. 建立 Log Analytics Workspace</h3>



<p>你可以直接執行以下指令來建立一個新的工作區：</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code>az monitor log-analytics workspace create `
  --resource-group $RESOURCE_GROUP `
  --workspace-name $WORKSPACE_NAME `
  --location $LOCATION
</code></pre>



<h3 class="wp-block-heading">2. 為什麼需要它？</h3>



<p>在建立 Container App Environment (CAE) 時，工作區就像是一個「大型儲存桶」，負責接收並儲存容器產生的所有日誌（Logs）和指標（Metrics）。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 自動化整合腳本 (從建立到取得 ID/Key)</h3>



<p>為了讓你後續建立 Container App Environment 順利，建議依照這個流程操作：</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code># 設定 Workspace 名稱 (自定義)
$WORKSPACE_NAME = "log-pr-prod-twn-01"

# Step A: 建立 Workspace
az monitor log-analytics workspace create `
  --resource-group $RESOURCE_GROUP `
  --workspace-name $WORKSPACE_NAME `
  --location $LOCATION

# Step B: 取得該 Workspace 的 ID
$WORKSPACE_ID = az monitor log-analytics workspace show `
  --resource-group $RESOURCE_GROUP `
  --workspace-name $WORKSPACE_NAME `
  --query id --output tsv

# Step C: 取得該 Workspace 的 Key
$WORKSPACE_KEY = az monitor log-analytics workspace get-shared-keys `
  --resource-group $RESOURCE_GROUP `
  --workspace-name $WORKSPACE_NAME `
  --query primarySharedKey --output tsv

# Step D: 現在你可以成功建立 Container App Env 了！
az containerapp env create `
  --name $CONTAINERAPP_ENVIRONMENT `
  --resource-group $RESOURCE_GROUP `
  --location $LOCATION `
  --logs-workspace-id $WORKSPACE_ID `
  --logs-workspace-key $WORKSPACE_KEY
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 小提醒</h3>



<ul class="wp-block-list">
<li><strong>定價層 (Pricing Tier)</strong>：預設建立的會是 <code>PerGB2018</code>，這是目前的標準定價模式，按量計費。</li>



<li><strong>保留天數</strong>：預設通常會保留 30 天的日誌，如果需要更長，可以在建立後調整。</li>



<li><strong>資源群組</strong>：請確保 <code>$RESOURCE_GROUP</code> 已經先建立好了（<code>az group create</code>），否則指令會報錯。</li>
</ul>



<p>你現在的 <code>$RESOURCE_GROUP</code> 和 <code>$LOCATION</code> 變數都已經設定好了嗎？（例如 <code>$LOCATION = "eastasia"</code>）</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>關於 Azure Log Analytics Workspace 的計費，這是一個「進來要錢、留著要錢、查一般不用錢」的邏輯。</p>



<p>以下是針對 2026 年最新計費模式的詳細拆解：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1. 實際會被收多少？ (按量計費)</h3>



<p>基本的「隨用隨付 (Pay-As-You-Go)」主要由兩個部分組成：</p>



<ul class="wp-block-list">
<li><strong>資料擷取 (Ingestion)：</strong> 每 GB 約為 <strong>$2.30 USD</strong>。
<ul class="wp-block-list">
<li><em>註：每個月通常有前 5 GB 的免費額度。</em></li>
</ul>
</li>



<li><strong>資料保留 (Retention)：</strong> * <strong>前 31 天免費</strong>。
<ul class="wp-block-list">
<li>超過 31 天後，每 GB 每月約收 <strong>$0.10 USD</strong>。</li>



<li>如果你是為了法規需要存好幾年（長效保留），價格會降到每 GB 約 <strong>$0.02 USD</strong>。</li>
</ul>
</li>
</ul>



<p><strong>簡單試算：</strong></p>



<p>如果你每天產生 1 GB 的日誌，一個月 30 GB。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>(30GB &#8211; 5GB 免費) × $2.30 = <strong>$57.5 USD / 月</strong> (約台幣 $1,800)。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 分析（查詢）需要錢嗎？</h3>



<p><strong>這取決於你使用的「資料層次 (Tier)」：</strong></p>



<ul class="wp-block-list">
<li><strong>Analytics Logs (預設)：</strong> <strong>查詢完全免費</strong>。你可以無限次執行 KQL 查詢來產出圖表。</li>



<li><strong>Basic Logs (基本日誌)：</strong> 這種層次擷取很便宜（約 $0.50/GB），但<strong>查詢要錢</strong>，每掃描 1 GB 資料約收 <strong>$0.005 USD</strong>。適合存那些「平常不看，出事才查」的資料。</li>



<li><strong>Search Job (搜尋作業)：</strong> 如果要在海量歷史資料中搜尋，會按掃描量計費。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 定價層 (Pricing Tiers)</h3>



<p>除了按量計費，如果你資料量很大，可以使用「承諾層級 (Commitment Tiers)」來打折：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>層級</strong></td><td><strong>每日資料量</strong></td><td><strong>折扣幅度 (預估)</strong></td></tr></thead><tbody><tr><td><strong>隨用隨付</strong></td><td>無限制</td><td>無折扣</td></tr><tr><td><strong>100 GB/日</strong></td><td>固定收 100 GB 的錢</td><td>約打 <strong>85 折</strong></td></tr><tr><td><strong>200 GB/日</strong></td><td>固定收 200 GB 的錢</td><td>約打 <strong>8 折</strong></td></tr><tr><td><strong>500 GB/日</strong></td><td>固定收 500 GB 的錢</td><td>約打 <strong>7 折</strong></td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 有 EPS (每秒事件數) 上限嗎？</h3>



<p>Azure Log Analytics <strong>沒有嚴格的 EPS 硬性上限</strong>，它是彈性擴張的，但有以下<strong>限流 (Throttling)</strong> 規則：</p>



<ul class="wp-block-list">
<li><strong>資料擷取速度：</strong> 單一個 Workspace 通常支援到 <strong>6 GB/分鐘</strong> 的擷取速度。如果超過，可能會遇到延遲，但資料不會遺失（會排隊）。</li>



<li><strong>API 調用限制：</strong> 如果你是透過 API 狂發日誌，每分鐘約有 200 次請求的限制。</li>



<li><strong>查詢限制：</strong> 為了防止惡意查詢榨乾資源，單一查詢最多跑 10 分鐘，且回傳結果上限為 30,000 列。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 專業建議：如何省錢？</h3>



<ol start="1" class="wp-block-list">
<li><strong>過濾掉沒用的日誌：</strong> 在 <code>az containerapp</code> 設定中，只傳送「錯誤 (Error)」或「重要 (Warning)」等級的日誌到 Workspace。</li>



<li><strong>善用 Basic Tier：</strong> 對於開發環境或測試環境的日誌，可以設定為 <code>Basic</code> 模式來節省 75% 的擷取成本。</li>



<li><strong>設定預算上限 (Daily Cap)：</strong> 你可以設定 Workspace 每天最多只能收多少 GB（例如 5GB），避免因為程式 Bug 產生無窮迴圈 Log 導致帳單爆炸。</li>
</ol>



<p>你目前預計每天產生的日誌量大約是多少？如果量很大，我可以直接幫你算承諾層級的划算程度。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">台灣資案法規, log 可以放其他國家嗎?</h2>



<p>這是一個非常關鍵的合規性問題。在台灣，Log（日誌）是否可以存放於境外，取決於你的<strong>產業屬性</strong>、<strong>公司身分</strong>以及 <strong>Log 內是否包含個人資料（PII）</strong>。</p>



<p>依照 2026 年最新的法規趨勢與《資通安全管理法》，我為你整理如下：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1. 公務機關與關鍵資訊基礎設施 (CII)</h3>



<p>如果你屬於政府單位、公務機關，或受託開發的廠商：</p>



<ul class="wp-block-list">
<li><strong>原則：禁止。</strong> 根據資安署規定，公務機關雲端資料（含備份、備援、日誌）的實體所在地<strong>不得位於大陸地區（含港澳）</strong>。</li>



<li><strong>落地要求：</strong> 對於高等級資安系統，通常要求資料儲存與處理需在<strong>本國境內</strong>。即使使用雲端，也傾向於選擇有「台灣資料中心」的服務（如 Azure 台灣區域）。</li>
</ul>



<h3 class="wp-block-heading">2. 特殊監管產業 (如金融、醫療)</h3>



<ul class="wp-block-list">
<li><strong>金融業：</strong> 受金管會高度監管。雖然目前法規已放寬雲端委外，但如果 Log 涉及客戶交易明細或個人敏感資料，通常需要報備，且必須確保受監管單位（金管會）能隨時進行實地稽核。</li>



<li><strong>醫療業：</strong> 根據最新的電子病歷及相關法規，涉及病患隱私的資料與 Log 通常要求存放於境內。</li>
</ul>



<h3 class="wp-block-heading">3. 一般民間企業 (受《個資法》規範)</h3>



<p>如果你是一般民間企業，Log 是否出境主要看 <strong>《個人資料保護法》第 21 條</strong>：</p>



<ul class="wp-block-list">
<li><strong>可以出境，但有條件：</strong> 除非主管機關（如經濟部、數發部）針對特定產業發布禁止令（例如過去曾禁止電商將個資傳往大陸），否則原則上可以國際傳輸。</li>



<li><strong>保護措施：</strong> 你必須確保接收資料的國家對個資有完善保護，且必須在隱私政策中告知用戶。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 實務建議：Log 存放於 Azure 的策略</h3>



<p>既然你在使用 Azure，建議採取以下三種策略來規避法律風險：</p>



<h4 class="wp-block-heading">方案 A：使用 Azure 台灣區域 (Taiwan North)</h4>



<p>Azure 已經在台灣（桃園/板橋一帶）設立資料中心。</p>



<ul class="wp-block-list">
<li><strong>做法：</strong> 建立 Log Analytics Workspace 時，將 <code>Location</code> 設定為 <code>Taiwan North</code>。</li>



<li><strong>優點：</strong> 滿足最嚴苛的「資料落地」要求，且網路延遲最低。</li>
</ul>



<h4 class="wp-block-heading">方案 B：資料去識別化 (Data Masking)</h4>



<p>如果你的應用程式 Log 包含使用者的 <strong>IP、Email、手機號碼</strong>，這些都屬於個資。</p>



<ul class="wp-block-list">
<li><strong>做法：</strong> 在將 Log 送往 Log Analytics 之前，在應用程式端進行加密（Hash）或遮罩處理。</li>



<li><strong>優點：</strong> 脫敏後的 Log 就不再屬於《個資法》定義的個人資料，存放於新加坡（Southeast Asia）或美國通常沒有合規問題。</li>
</ul>



<h4 class="wp-block-heading">方案 C：分層儲存</h4>



<ul class="wp-block-list">
<li><strong>做法：</strong> * <strong>一般日誌：</strong> 放境外（便宜）。
<ul class="wp-block-list">
<li><strong>稽核日誌 (Audit Logs)：</strong> 包含敏感操作或個資，強制放在台灣境內或地端。</li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">總結檢查清單</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>情況</strong></td><td><strong>是否可放境外 (如新加坡/美國)？</strong></td><td><strong>備註</strong></td></tr></thead><tbody><tr><td><strong>公務機關 / 關鍵基設</strong></td><td><strong>否</strong></td><td>必須在本國境內。</td></tr><tr><td><strong>涉及個資的 Log</strong></td><td><strong>需評估</strong></td><td>需符合個資法國際傳輸規定。</td></tr><tr><td><strong>純系統/效能 Log</strong></td><td><strong>是</strong></td><td>通常無法律限制。</td></tr><tr><td><strong>中國地區 (含港澳)</strong></td><td><strong>絕對禁止</strong></td><td>台灣資安法明確排斥。</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>提示：</strong> 雖然 Azure <code>East Asia</code> 指的是香港，但根據台灣目前的資安政策，<strong>高度建議不要將涉及個資或資安的 Log 放在香港</strong>，建議優先選擇 <code>Taiwan North</code>。</p>
</blockquote>



<p>你的應用程式是否會處理到身分證字號、信用卡號等敏感資料並印在 Log 裡呢？</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="84" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-54-5n-1024x84.jpg?v=1776765301" alt="" class="wp-image-8317" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-54-5n-1024x84.jpg?v=1776765301 1024w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-54-5n-600x49.jpg?v=1776765301 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-54-5n-768x63.jpg?v=1776765301 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-54-5n-1536x126.jpg?v=1776765301 1536w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/WindowsTerminal_2026-04-21-17-54-5n-2048x168.jpg?v=1776765301 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<pre class="wp-block-code"><code>az containerapp env create `
>>   --name $CONTAINERAPP_ENVIRONMENT `
>>   --resource-group $RESOURCE_GROUP `
>>   --location $LOCATION `
>>   --logs-workspace-id $WORKSPACE_ID `
>>   --logs-workspace-key $WORKSPACE_KEY
You cannot create a Containerapp environment in location taiwannorth. List of eligible locations: westus2, southeastasia, swedencentral, canadacentral, westeurope, northeurope, eastus, eastus2, eastasia, australiaeast, germanywestcentral, japaneast, uksouth, westus, centralus, northcentralus, southcentralus, koreacentral, brazilsouth, westus3, francecentral, southafricanorth, norwayeast, switzerlandnorth, uaenorth, canadaeast, westcentralus, ukwest, centralindia, japanwest, australiasoutheast, francesouth, spaincentral, italynorth, polandcentral, southindia.</code></pre>



<p>看起來你撞到了 Azure 區域功能的硬傷。雖然 <strong>Taiwan North (台灣北部)</strong> 已經上線，但並非所有服務（特別是 <strong>Container Apps</strong> 這種比較新的託管服務）都會在第一時間支援該區域。</p>



<p>根據錯誤訊息，<strong>Taiwan North 目前還不支援 Container Apps Environment</strong>。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1. 解決方案：更換區域</h3>



<p>既然 Log 法律合規性是你考量的重點，且台灣暫時不可用，建議改用 <strong>Singapore (southeastasia)</strong>。</p>



<ul class="wp-block-list">
<li><strong>優點：</strong> 離台灣最近，延遲低，且非中國地區，符合多數民間企業的資安規範。</li>



<li><strong>注意：</strong> 如果你改了區域，<strong>Log Analytics Workspace 也必須重新建立在同一個區域</strong>，否則會報錯或產生跨區域流量費用。</li>
</ul>



<h3 class="wp-block-heading">2. 修正後的執行腳本</h3>



<p>請依序執行以下步驟（我們把 Location 硬切到 <code>southeastasia</code>）：</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code># 1. 更新區域變數
$LOCATION = "southeastasia"

# 2. 重新建立或更新 Workspace (要在同一個區域)
az monitor log-analytics workspace create `
  --resource-group $RESOURCE_GROUP `
  --workspace-name $WORKSPACE_NAME `
  --location $LOCATION

# 3. 重新抓取 ID 和 Key (確保是新的)
$WORKSPACE_ID = az monitor log-analytics workspace show --resource-group $RESOURCE_GROUP --workspace-name $WORKSPACE_NAME --query id -o tsv
$WORKSPACE_KEY = az monitor log-analytics workspace get-shared-keys --resource-group $RESOURCE_GROUP --workspace-name $WORKSPACE_NAME --query primarySharedKey -o tsv

# 4. 再次嘗試建立 Container App Environment
az containerapp env create `
  --name $CONTAINERAPP_ENVIRONMENT `
  --resource-group $RESOURCE_GROUP `
  --location $LOCATION `
  --logs-workspace-id $WORKSPACE_ID `
  --logs-workspace-key $WORKSPACE_KEY
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 關於法規的應對 (當 Location 為新加坡時)</h3>



<p>如果你的公司必須遵守「資料落地台灣」，而技術上又必須使用 Container Apps，目前有兩種彈性做法：</p>



<ul class="wp-block-list">
<li><strong>混合雲模式：</strong> 把運算放在 <code>southeastasia</code>，但資料庫（SQL/Storage）放在 <code>taiwannorth</code>。Log 則透過 <strong>Diagnostic Settings</strong> 同步一份備份回台灣境內的 Storage Account。</li>



<li><strong>等待期：</strong> 依照 2026 年的進度，台灣區域的服務正在陸續補齊。你可以先在新加坡開發，等 <code>taiwannorth</code> 支援 Container Apps 後再進行區域轉移（Region Move）。</li>
</ul>



<h3 class="wp-block-heading">4. 如何檢查該區域支援哪些服務？</h3>



<p>如果你想確認某個區域到底能不能用，可以執行：</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code>az provider show -n Microsoft.App --query "resourceTypes&#91;?resourceType=='managedEnvironments'].locations" -o json
</code></pre>



<p>這會直接噴出目前全球支援 Container App Environment 的所有清單，你可以看到 <code>taiwannorth</code> 是否在裡面。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/azure-log-analytics-workspace/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Azure Container Apps (ACA) 存取 VNet 內的資源</title>
		<link>https://stackoverflow.max-everyday.com/2026/04/azure-container-apps-vnet/</link>
					<comments>https://stackoverflow.max-everyday.com/2026/04/azure-container-apps-vnet/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 15 Apr 2026 10:01:45 +0000</pubDate>
				<category><![CDATA[Azure 筆記]]></category>
		<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[azure]]></category>
		<guid isPermaLink="false">https://stackoverflow.max-everyday.com/?p=8293</guid>

					<description><![CDATA[既然你已經從 Web App 遷移到 Azure...]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="559" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/azure-container-apps-vnet_clean-1024x559.jpg?v=1776247294" alt="" class="wp-image-8295" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/azure-container-apps-vnet_clean-1024x559.jpg?v=1776247294 1024w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/azure-container-apps-vnet_clean-600x327.jpg?v=1776247294 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/azure-container-apps-vnet_clean-768x419.jpg?v=1776247294 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2026/04/azure-container-apps-vnet_clean.jpg?v=1776247294 1408w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>既然你已經從 Web App 遷移到 <strong>Azure Container Apps (ACA)</strong>，網路架構的邏輯會稍微有些不同。ACA 本身就是建立在一個名為 <strong>Container Apps Environment</strong> 的容器環境中，因此 VNet 的整合是在「環境 (Environment)」層級設定的，而不是單獨在特定的 App 上。</p>



<p>存取 VNet 資源的流程主要分為：<strong>環境網路配置</strong>、<strong>基礎架構委派</strong>、以及 <strong>ACA 部署</strong>。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1. 核心觀念：VNet 整合模式</h3>



<p>ACA 支援兩種網路模式：</p>



<ul class="wp-block-list">
<li><strong>External (外部)</strong>：環境有公網 IP，但後端可以存取 VNet 資源。</li>



<li><strong>Internal (內部)</strong>：環境沒有公網 IP，所有存取都必須透過 VNet（適合純內網系統）。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 實作流程與 CLI 指令</h3>



<h4 class="wp-block-heading">第一步：建立（或準備）Subnet 並設定委派</h4>



<p>與 Web App 相似，ACA 的 Subnet 也需要特定的委派，但它是委派給 <code>Microsoft.App/environments</code>。</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code># 定義變數 (假設 VNet 在不同的 RG)
$VNET_RG = "rg-network-shared"
$VNET_NAME = "vnet-pr-stg-twn-01"
$ACA_SUBNET_NAME = "snet-aca-integration" # 建議建立一個新的 Subnet

# 更新 Subnet 委派
az network vnet subnet update `
  --resource-group $VNET_RG `
  --vnet-name $VNET_NAME `
  --name $ACA_SUBNET_NAME `
  --delegations Microsoft.App/environments
</code></pre>



<h4 class="wp-block-heading">第二步：取得 Subnet ID</h4>



<p>跨 RG 操作時，直接拿 ID 最安全：</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code>$SUBNET_ID = $(az network vnet subnet show `
  --resource-group $VNET_RG `
  --vnet-name $VNET_NAME `
  --name $ACA_SUBNET_NAME `
  --query id -o tsv)
</code></pre>



<h4 class="wp-block-heading">第三步：建立 Container Apps Environment 並綁定 VNet</h4>



<p>這是關鍵步驟。一旦 Environment 建立並綁定 VNet，該環境下所有的 Container Apps 都能直接存取該 VNet 內的資源。</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code>$ENVIRONMENT_NAME = "cae-pr-stg-twn-001"

az containerapp env create `
  --name $ENVIRONMENT_NAME `
  --resource-group $RESOURCE_GROUP `
  --location "taiwannorth" `
  --infrastructure-subnet-id $SUBNET_ID `
  --internal-client-ip-dns-mode "None"  # 如果需要外部存取設為 None，純內網設為 Internal
</code></pre>



<h4 class="wp-block-heading">第四步：部署 Container App 到該環境</h4>



<p>PowerShell</p>



<pre class="wp-block-code"><code>az containerapp create `
  --name "my-fast-app" `
  --resource-group $RESOURCE_GROUP `
  --environment $ENVIRONMENT_NAME `
  --image "${ACR_NAME}.azurecr.io/policy-app:v1" `
  --registry-server "${ACR_NAME}.azurecr.io" `
  --target-port 80 `
  --ingress 'external' # 允許外部流量進來
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 如何存取 VNet 內的資源？</h3>



<p>部署完成後，你的 Container App 就像是在 VNet 內的一台機器：</p>



<ul class="wp-block-list">
<li><strong>透過 IP 存取</strong>：你可以直接 ping 或連線 VNet 內 VM 的私有 IP。</li>



<li><strong>透過 DNS 存取</strong>：如果你 VNet 內有設定 <strong>Azure Private DNS Zones</strong>，你需要確保 ACA 環境關聯了該 Private DNS，這樣才能解析例如 <code>mydb.privatelink.database.azure.com</code> 這樣的域名。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 權限鬼打牆預警 (RBAC)</h3>



<p>因為你跨了 Resource Group，且不是 Owner：</p>



<ol start="1" class="wp-block-list">
<li><strong>Network Contributor</strong>：你的帳號必須在 <code>VNet RG</code> 擁有這個角色，否則無法將 ACA 環境掛載到該 Subnet。</li>



<li><strong>Managed Identity</strong>：如果你的 ACA 需要存取 Key Vault 或 SQL (存取權限控管)，建議幫 ACA 開啟 <code>System Assigned Identity</code>。</li>
</ol>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 總結</h3>



<p>ACA 的優勢在於<strong>一次設定，全家享用</strong>。只要把 <code>Environment</code> 塞進 VNet，之後在裡面建立的幾十個微服務就通通都能連內網了。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>寫一段建立新 Subnet 的指令</strong></p>



<p>既然要為 <strong>Azure Container Apps (ACA)</strong> 建立新的 Subnet，我們必須確保該 Subnet 的位址空間不與現有的資源衝突，並且正確設定 <strong>委派 (Delegation)</strong>。</p>



<p>在跨 Resource Group 的情境下，請執行以下 PowerShell 指令：</p>



<h3 class="wp-block-heading">1. 定義變數</h3>



<p>請根據你的實際環境修改位址範圍（例如 <code>10.0.2.0/24</code>）：</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code>$VNET_RG = "rg-network-shared"         # VNet 所在的 RG
$VNET_NAME = "vnet-pr-stg-twn-01"       # 現有的 VNet 名稱
$NEW_SUBNET_NAME = "snet-aca-infra-01"  # 新 Subnet 的名字
$ADDRESS_PREFIX = "10.0.2.0/24"         # 確保此範圍在 VNet 內且未被使用
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 建立 Subnet 並設定委派</h3>



<p>我們使用 <code>az network vnet subnet create</code> 指令。關鍵在於 <code>--delegations</code>，這會告訴 Azure：「這個網段是給 ACA 環境專用的」。</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code>az network vnet subnet create `
  --resource-group $VNET_RG `
  --vnet-name $VNET_NAME `
  --name $NEW_SUBNET_NAME `
  --address-prefixes $ADDRESS_PREFIX `
  --delegations "Microsoft.App/environments"
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 取得新 Subnet 的 ID (供後續建立 ACA 環境使用)</h3>



<p>建立完成後，建議直接把 ID 存起來，這樣在建立 ACA Environment 時才不會因為名稱解析問題而「鬼打牆」：</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code>$ACA_SUBNET_ID = $(az network vnet subnet show `
  --resource-group $VNET_RG `
  --vnet-name $VNET_NAME `
  --name $NEW_SUBNET_NAME `
  --query id -o tsv)

# 驗證一下有沒有抓到
echo $ACA_SUBNET_ID
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 執行前的注意事項 (避免再次鬼打牆)</h3>



<ul class="wp-block-list">
<li><strong>位址衝突</strong>：請先確認 <code>$ADDRESS_PREFIX</code> 沒有被 VNet 內其他的 Subnet 佔用。你可以執行 <code>az network vnet show -g $VNET_RG -n $VNET_NAME --query "subnets[].addressPrefix"</code> 來查看已使用的網段。</li>



<li><strong>Subnet 大小</strong>：ACA 規定最小必須是 <strong>/23</strong> (512 個 IP) 或 <strong>/27</strong> (32 個 IP)，具體取決於你的工作負載。對於測試環境，建議至少使用 <strong><code>/24</code></strong> 或 <strong><code>/23</code></strong>，因為 ACA 在升級（Rolling update）或擴展時會消耗大量 IP。</li>



<li><strong>權限</strong>：雖然你不是 Owner，但只要你在 <code>$VNET_RG</code> 擁有 <strong>Network Contributor</strong> 角色，就可以成功執行這段指令。</li>
</ul>



<p>下一步你就可以拿著 <code>$ACA_SUBNET_ID</code> 去執行 <code>az containerapp env create</code> 了。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>準備建立環境的完整指令</p>



<p>沒問題！我們直接把 <strong>建立 Subnet</strong> 到 <strong>建立 ACA 環境</strong> 的完整流程串起來。這組指令會確保你的 Container Apps 基礎設施能夠正確與 VNet 銜接。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">第一階段：建立 Subnet (跨 RG)</h3>



<p>請確保你已經定義了之前討論的變數（<code>$VNET_RG</code>, <code>$VNET_NAME</code> 等）。</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code># 1. 在指定的 VNet RG 下建立專屬 Subnet
az network vnet subnet create `
  --resource-group $VNET_RG `
  --vnet-name $VNET_NAME `
  --name $NEW_SUBNET_NAME `
  --address-prefixes $ADDRESS_PREFIX `
  --delegations "Microsoft.App/environments"

# 2. 獲取該 Subnet 的 Resource ID (這是建立環境的必要參數)
$ACA_SUBNET_ID = $(az network vnet subnet show `
  --resource-group $VNET_RG `
  --vnet-name $VNET_NAME `
  --name $NEW_SUBNET_NAME `
  --query id -o tsv)
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">第二階段：建立 ACA 環境 (Managed Environment)</h3>



<p>這是 ACA 的核心，「環境」決定了容器的網路邊界。</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code># 定義環境名稱
$ENVIRONMENT_NAME = "cae-pr-stg-twn-001"

# 建立環境並掛載到 VNet ID
az containerapp env create `
  --name $ENVIRONMENT_NAME `
  --resource-group $RESOURCE_GROUP `
  --location "taiwannorth" `
  --infrastructure-subnet-id $ACA_SUBNET_ID `
  --internal-client-ip-dns-mode "None"
</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 專業提示：</strong></p>



<ul class="wp-block-list">
<li><code>--internal-client-ip-dns-mode "None"</code>：這代表你的 ACA 會有一個公用 IP (External)。如果你希望這是一個<strong>純內網</strong>（外面完全連不到）的環境，請將此參數改為 <code>Internal</code>。</li>
</ul>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">第三階段：部署第一個 Container App</h3>



<p>現在環境已經在 VNet 裡了，我們把你的 App 丟進去測試連通性。</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code>az containerapp create `
  --name "app-pr-stg-twn" `
  --resource-group $RESOURCE_GROUP `
  --environment $ENVIRONMENT_NAME `
  --image "${ACR_NAME}.azurecr.io/policy-app:v1" `
  --registry-server "${ACR_NAME}.azurecr.io" `
  --registry-username $ACR_USERNAME `
  --registry-password $ACR_PASSWORD `
  --target-port 80 `
  --ingress 'external' `
  --query "properties.configuration.ingress.fqdn"
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">網路架構圖解</h3>



<p>這套設定完成後，你的網路架構會長這樣：</p>



<h3 class="wp-block-heading">驗證 VNet 連通性</h3>



<p>部署成功後，你可以進入 ACA 的「主控台 (Console)」或是透過 <code>az containerapp exec</code> 嘗試 ping VNet 內的資源（例如資料庫的 Private IP）：</p>



<p>PowerShell</p>



<pre class="wp-block-code"><code># 進入容器內部測試
az containerapp exec --name "app-pr-stg-twn" --resource-group $RESOURCE_GROUP --command "ping 10.0.1.5"
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6d1.png" alt="🛑" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 避坑指南：關於「位置 (Location)」</h3>



<p>ACA 與 VNet 整合時，<strong>Region 必須完全一致</strong>。</p>



<ul class="wp-block-list">
<li>如果 VNet 在 <code>Japan East</code>，指令中的 <code>--location</code> 必須填 <code>japaneast</code>。</li>



<li>如果 VNet 在 <code>Taiwan North</code>，則填 <code>taiwannorth</code>。</li>
</ul>



<p>如果跨區建立，<code>az containerapp env create</code> 會報錯並告訴你 Subnet 不在該區域。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>在使用 Azure Container Apps (ACA) 時，理解「環境 (Environment)」與「網路 (VNet)」的關係至關重要。你的觀察很準確：ACA 的網路配置確實是綁定在 <strong>Environment</strong> 層級，這決定了該環境下所有 Microservices 的通訊邊界。</p>



<p>以下是針對你問題的詳細解析：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. 容器應用程式環境 (Environment) 如何設定？</h2>



<p>在建立 ACA 環境時，網路設定主要分為兩大模式。一旦環境建立後，<strong>虛擬網路配置是無法更改的</strong>（例如：不能從內網模式改為外網模式）。</p>



<h3 class="wp-block-heading">核心設定步驟：</h3>



<ol start="1" class="wp-block-list">
<li><strong>選擇 VNet 整合模式</strong>：
<ul class="wp-block-list">
<li><strong>External (外部)</strong>：環境會有一個<strong>公用 IP</strong>。雖然它整合在你的 VNet 中，但入口 (Ingress) 是對外開放的。</li>



<li><strong>Internal (內部)</strong>：環境使用 <strong>VNet 私有 IP</strong>。入口僅限於 VNet 內部或透過 VPN/ExpressRoute 連線的對象。</li>
</ul>
</li>



<li><strong>準備子網 (Subnet)</strong>：
<ul class="wp-block-list">
<li>ACA 環境需要一個<strong>專用子網</strong>（建議 CIDR 至少為 <code>/23</code> 或 <code>/27</code>，取決於規模）。</li>



<li>該子網必須委派 (Delegate) 給 <code>Microsoft.App/testClients</code>（在使用門戶時會自動處理）。</li>
</ul>
</li>



<li><strong>基礎結構資源群組</strong>：
<ul class="wp-block-list">
<li>ACA 會自動建立一個額外的資源群組（名稱通常以 <code>MC_</code> 開頭），用來放置負載平衡器、Managed Identity 等底層元件。</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. ACA 可以連到多個 VNet 嗎？</h2>



<p><strong>答案是：一個環境（Environment）只能「直接」加入一個 VNet。</strong></p>



<p>但是，如果你需要 ACA 存取其他 VNet 中的資源，可以透過 Azure 的標準網路技術來達成：</p>



<ul class="wp-block-list">
<li><strong>VNet Peering (虛擬網路對等)</strong>：這是最常見的做法。將 ACA 所在的 VNet 與目標 VNet 串連，ACA 就能像存取本地資源一樣存取對端資源。</li>



<li><strong>Private Endpoints (私有端點)</strong>：如果目標是 PaaS 服務（如 SQL, Key Vault），建議在 ACA 所在的 VNet 中建立 Private Endpoint。</li>



<li><strong>Virtual WAN</strong>：對於跨區域或大規模的多 VNet 架構，透過 Hub-and-Spoke 模型達成互連。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. 如何設定「對外的網路」？</h2>



<p>如果你希望 ACA 具備對外服務的能力，同時又想保有 VNet 的控制權，有以下兩種策略：</p>



<h3 class="wp-block-heading">策略 A：使用 External 模式 (最簡單)</h3>



<p>在建立環境時，將 <strong>Virtual IP</strong> 設定為 <code>External</code>。</p>



<ul class="wp-block-list">
<li><strong>優點</strong>：Azure 會自動為你的 Environment Ingress 分配一個公用 IP。</li>



<li><strong>缺點</strong>：控制力較弱，所有 Container App 的外網入口都共用同一個 IP。</li>
</ul>



<h3 class="wp-block-heading">策略 B：使用 Internal 模式 + Application Gateway (最推薦/安全)</h3>



<p>這是企業級架構的首選。將 ACA 設定為 <code>Internal</code>（不對外），然後在 VNet 前端放一個 <strong>Azure Application Gateway</strong>。</p>



<ul class="wp-block-list">
<li><strong>架構邏輯</strong>：
<ol start="1" class="wp-block-list">
<li><strong>ACA 環境</strong>：隱藏在 VNet 私有子網中。</li>



<li><strong>App Gateway</strong>：擁有公用 IP，負責接收外部流量。</li>



<li><strong>轉發</strong>：App Gateway 透過私有網路將流量導向 ACA 的內部負載平衡器位址。</li>
</ol>
</li>



<li><strong>優點</strong>：可以加上 <strong>WAF (網頁應用程式防火牆)</strong> 防護，且能更精確地管理 SSL 憑證。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">快速比較表</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>功能</strong></td><td><strong>External 模式</strong></td><td><strong>Internal 模式 (+ Gateway)</strong></td></tr></thead><tbody><tr><td><strong>公用存取</strong></td><td>直接由 ACA 環境提供</td><td>由 Gateway 提供，ACA 隱身</td></tr><tr><td><strong>安全性</strong></td><td>基本保護</td><td>高 (可加裝 WAF)</td></tr><tr><td><strong>VNet 整合</strong></td><td>是</td><td>是</td></tr><tr><td><strong>適用場景</strong></td><td>快速開發、簡單網站</td><td>企業正式環境、API 閘道需求</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>溫馨提醒</strong>：在規劃子網空間時，請務必留足 IP 數量。ACA 在擴展 (Scale out) 時會消耗子網內的 IP，如果 IP 用盡，容器將無法啟動。</p>
</blockquote>



<p>你目前的架構是打算直接讓每個 App 都有獨立的公用 IP，還是希望能有一個統一的入口來管理這些流量？</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">App Gateway 費用</h2>



<p>在使用 Azure Application Gateway 作為 Azure Container Apps (ACA) 的入口時，費用是許多開發者最關心的部分。App Gateway 的計費模式相較於其他服務稍微複雜一些，主要由 <strong>「固定費用」</strong> 與 <strong>「容量單位費用」</strong> 兩部分組成。</p>



<p>目前建議使用 <strong>Standard_v2</strong> 或 <strong>WAF_v2</strong> 版本，因為它們支援自動調整大小 (Autoscaling) 且效能更佳。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. 費用結構分解 (以 v2 版本為例)</h2>



<h3 class="wp-block-heading">A. 固定時薪 (Fixed Cost)</h3>



<p>只要你部署了 Application Gateway，不論流量多少，每小時都會產生固定費用。</p>



<ul class="wp-block-list">
<li><strong>Standard_v2</strong>: 約 <strong>$0.20 USD / 小時</strong> (一個月約 $144 USD)。</li>



<li><strong>WAF_v2 (含防火牆)</strong>: 約 <strong>$0.40 USD / 小時</strong> (一個月約 $288 USD)。</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>注意：如果啟用了「自動調整大小」，且執行個體數目為 0，仍會收取此固定費用。</em></p>
</blockquote>



<h3 class="wp-block-heading">B. 容量單位費用 (Capacity Unit, CU)</h3>



<p>這是根據實際使用量計費的部分。1 個 CU 每小時約 <strong>$0.008 USD</strong>。</p>



<p>Azure 會從以下三個維度計算，並取其 <strong>「最大值」</strong> 來決定該小時消耗了多少個 CU：</p>



<ol start="1" class="wp-block-list">
<li><strong>計算量 (Compute)</strong>：處理連線的 CPU 消耗。</li>



<li><strong>持續連線數 (Persistent Connections)</strong>：每 2,500 個連線算 1 個 CU。</li>



<li><strong>吞吐量 (Throughput)</strong>：每 2.22 Mbps 的資料傳輸量算 1 個 CU。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. 預估案例 (以台幣/美金概算)</h2>



<p>假設你是一個中小型專案，流量穩定且不大的情況：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>項目</strong></td><td><strong>Standard_v2 (無 WAF)</strong></td><td><strong>WAF_v2 (含防火牆)</strong></td></tr></thead><tbody><tr><td><strong>月固定費用</strong></td><td>約 $144 USD (約 NT$ 4,600)</td><td>約 $288 USD (約 NT$ 9,200)</td></tr><tr><td><strong>低流量 CU 費用</strong></td><td>約 $10 ~ $20 USD</td><td>約 $10 ~ $20 USD</td></tr><tr><td><strong>每月總估計</strong></td><td><strong>約 NT$ 5,000 ~ 6,000</strong></td><td><strong>約 NT$ 9,500 ~ 11,000</strong></td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. 節省費用的替代方案</h2>



<p>如果你的預算有限，或是專案還在初期開發階段，直接使用 App Gateway 可能會覺得負擔太重。以下是針對 ACA 的其他選擇：</p>



<ul class="wp-block-list">
<li><strong>ACA 內建 External 模式</strong>：
<ul class="wp-block-list">
<li><strong>費用</strong>：<strong>$0</strong> (這功能是免費提供的)。</li>



<li><strong>優點</strong>：設定極快，自動獲得公用 IP 和 FQDN。</li>



<li><strong>缺點</strong>：無法進行細部的進階路由控制或加裝 WAF。</li>
</ul>
</li>



<li><strong>Azure Front Door (AFD)</strong>：
<ul class="wp-block-list">
<li><strong>費用</strong>：按流量計費，基本方案 (Standard) 每月固定費約 <strong>$35 USD</strong> 起。</li>



<li><strong>適合</strong>：全球分散的應用程式。雖然連線到內部 VNet 的 ACA 需要搭配 Private Link Service，但整體起步成本可能比 App Gateway 低。</li>
</ul>
</li>



<li><strong>Cloudflare + ACA External Ingress</strong>：
<ul class="wp-block-list">
<li><strong>費用</strong>：Cloudflare 有免費版。</li>



<li><strong>做法</strong>：讓 ACA 維持 External，但限制只有 Cloudflare 的 IP 可以進入。這能以最低成本獲得 WAF 和 DDoS 防護。</li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">總結建議</h2>



<ul class="wp-block-list">
<li><strong>如果你需要嚴格的內網安全控管</strong>：必須選 App Gateway (Internal 模式)，請預留每月至少台幣 5,000 元以上的預算。</li>



<li><strong>如果你只是想要有個對外網路，且沒有法規合規壓力</strong>：建議先從 ACA 的 <strong>External Ingress</strong> 開始使用，這部分是免費的，等流量變大或有安全需求後再掛載 App Gateway。</li>
</ul>



<p>你目前預計的流量規模大概是多少？如果只是個人測試或輕量級 API，或許 External 模式配上 API Management (Consumption Tier) 會是更省錢的選擇。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">對比ACA 使用 External 模式的費用</h2>



<p>簡單來說，<strong>ACA External 模式是「內建免費」的</strong>，而掛載 <strong>App Gateway</strong> 則是一筆顯著的「額外固定支出」。</p>



<p>以下是兩者的詳細費用對比：</p>



<h3 class="wp-block-heading">1. 費用對比表 (2026 預估價格)</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>項目</strong></td><td><strong>ACA External 模式</strong></td><td><strong>Internal 模式 + App Gateway (v2)</strong></td></tr></thead><tbody><tr><td><strong>入口服務費</strong></td><td><strong>$0</strong> (內建功能)</td><td><strong>$144+ USD/月</strong> (固定時薪)</td></tr><tr><td><strong>防火牆 (WAF)</strong></td><td>無 (僅基本 DDoS 防護)</td><td><strong>$288+ USD/月</strong> (固定時薪)</td></tr><tr><td><strong>流量處理費</strong></td><td>每百萬次請求 $0.40 USD</td><td>每容量單位 (CU) $0.008 USD/時</td></tr><tr><td><strong>固定低消</strong></td><td><strong>$0</strong> (用多少付多少)</td><td><strong>約 NT$ 4,600 ~ 9,000 / 月</strong></td></tr><tr><td><strong>設定難度</strong></td><td>極低 (一鍵開啟)</td><td>中高 (需設定子網與後端池)</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 深入分析：為什麼費用差這麼多？</h3>



<h4 class="wp-block-heading"><strong>ACA External 模式：省錢之選</strong></h4>



<p>在 External 模式下，Azure 會為你的環境建立一個共用的負載平衡器（Load Balancer）。</p>



<ul class="wp-block-list">
<li><strong>省錢點</strong>：你不需要支付這個負載平衡器的「租金」，只需要支付 ACA 本身的算力費（CPU/Memory）和請求數費。</li>



<li><strong>免費額度</strong>：ACA 每個月有 <strong>200 萬次免費請求</strong>。如果你的流量很小，入口端幾乎是 <strong>完全免費</strong>。</li>



<li><strong>適合對象</strong>：個人專案、開發測試環境、預算有限的小型 API。</li>
</ul>



<h4 class="wp-block-heading"><strong>App Gateway (v2)：安全與控制之選</strong></h4>



<p>當你為了安全性選擇 <code>Internal</code> 模式並掛上 App Gateway 時，你買的是一個<strong>專用的虛擬設備</strong>。</p>



<ul class="wp-block-list">
<li><strong>費用組成</strong>：
<ul class="wp-block-list">
<li><strong>固定費用</strong>：只要服務開著，每小時都在燒錢（約 $0.20 USD/hr）。</li>



<li><strong>WAF 加值</strong>：如果你要防範 SQL Injection 或惡意攻擊，開啟 WAF 功能會讓固定費用直接翻倍。</li>
</ul>
</li>



<li><strong>適合對象</strong>：企業級應用、需要自訂複雜路由規則、或是法規要求必須有 Web 應用程式防火牆 (WAF) 的場景。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 我該選哪一個？</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>場景一：我想要最省錢，且不需要複雜的網路控管。</strong></p>



<ul class="wp-block-list">
<li><strong>建議</strong>：直接使用 <strong>ACA External 模式</strong>。</li>



<li><strong>省錢秘訣</strong>：如果你擔心安全，可以在前端掛一個 <strong>Cloudflare</strong>（免費版），並在 ACA 設定 <code>IP Restrictions</code>，只允許 Cloudflare 的 IP 進入。這樣你一毛錢 App Gateway 的費用都不用出。</li>
</ul>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>場景二：我需要符合資安合規，且容器必須隱藏在內網。</strong></p>



<ul class="wp-block-list">
<li><strong>建議</strong>：使用 <strong>App Gateway v2</strong> 或最新的 <strong>Application Gateway for Containers</strong> (更適合容器化架構，費用略低但功能更現代)。</li>



<li><strong>預算準備</strong>：每個月請至少準備 <strong>NT$ 5,000</strong> 作為基礎網路開銷。</li>
</ul>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 補充：另一種平衡選擇 (Azure Front Door)</h3>



<p>如果你有多個區域部署，或是覺得 App Gateway 太貴，可以考慮 <strong>Azure Front Door (Standard)</strong>。</p>



<ul class="wp-block-list">
<li><strong>優點</strong>：它是按流量計費，每個月固定費大約 <strong>$35 USD</strong> (約 NT$ 1,100)，比 App Gateway 便宜許多，且同樣具備基本的 WAF 功能和全球加速。</li>



<li><strong>搭配方式</strong>：ACA 設定為 External，前端掛 Front Door 並限制只有 Front Door 的流量能進入。</li>
</ul>



<p><strong>總結建議：</strong> 如果只是想讓網路通，<strong>External 模式</strong> 是最划算的，它讓你省去每個月數千元的網路固定支出。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">ACA使用 External 模式  也有 load balance ?</h2>



<p>有的，<strong>ACA 在 External 模式下「內建」了強大的負載平衡功能</strong>，只是它被封裝在服務內部，你不需要手動建立 Load Balancer 資源。</p>



<p>當你開啟 External Ingress 時，Azure 會在背景為你處理好一切：</p>



<h3 class="wp-block-heading">1. 內建負載平衡的運作邏輯</h3>



<p>ACA 的負載平衡是在兩個層級進行的：</p>



<ul class="wp-block-list">
<li><strong>流量入口 (Ingress 層)</strong>：Azure 會在該環境（Environment）前端自動配置一個 <strong>L7 負載平衡器（基於 Envoy Proxy）</strong>。它會接收來自公網的請求，並處理 TLS 終端（HTTPS 憑證加密）、路徑路由等工作。</li>



<li><strong>複本分配 (Replica 層)</strong>：如果你的容器應用程式設定了多個複本（Replicas），內建的負載平衡器會自動將請求分發到這些健康的複本上。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. External 模式提供的功能</h3>



<p>雖然是內建免費，但它提供的功能相當完整：</p>



<ul class="wp-block-list">
<li><strong>自動 HTTPS</strong>：系統會自動為你的 <code>*.azurecontainerapps.io</code> 域名提供託管憑證。</li>



<li><strong>流量分割 (Traffic Splitting)</strong>：這是一大強項。你可以同時運行兩個版本（Revision），並設定 80% 流量去舊版、20% 去新版，實現 <strong>藍綠部署 (Blue-green)</strong> 或 <strong>金絲雀發佈 (Canary)</strong>。</li>



<li><strong>工作階段親和性 (Session Affinity)</strong>：支援 HTTP 工作階段綁定（Sticky Sessions），確保同一使用者的請求導向同一個複本。</li>



<li><strong>自訂網域名稱</strong>：你可以掛載自己的網域，ACA 也會幫你管理 SSL 憑證。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 與 App Gateway 的本質區別</h3>



<p>你可能會問：「既然 ACA 已經有 Load Balance 了，為什麼還有人要花錢買 App Gateway？」</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>功能</strong></td><td><strong>ACA 內建 Load Balancer</strong></td><td><strong>App Gateway (額外付費)</strong></td></tr></thead><tbody><tr><td><strong>位置</strong></td><td>緊貼容器環境內部</td><td>位於 VNet 的最前端</td></tr><tr><td><strong>WAF 安全防護</strong></td><td><strong>無</strong> (僅基本 DDoS)</td><td><strong>有</strong> (防 SQL 注入、XSS 攻擊)</td></tr><tr><td><strong>URL 重寫</strong></td><td>功能較基本</td><td>強大且靈活的重寫規則</td></tr><tr><td><strong>多站點託管</strong></td><td>主要是單一 App 的 Ingress</td><td>可同時管理多個不同服務的後端</td></tr><tr><td><strong>管理成本</strong></td><td><strong>$0</strong> (全自動)</td><td>需支付固定月租費</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">結論</h3>



<p>如果你只是需要<strong>流量分發</strong>、<strong>自動擴展</strong>、<strong>HTTPS</strong> 以及 <strong>版本切換</strong>，ACA 的 <strong>External 模式</strong> 已經完全足夠，而且<strong>完全免費</strong>。</p>



<p>你只需要在 App 的「輸入 (Ingress)」設定中，將 <code>Ingress</code> 設為 <code>Enabled</code>，並將 <code>Traffic</code> 設為 <code>Accepting traffic from anywhere</code>，你的 Load Balance 就已經啟動了！</p>



<p>你目前的應用程式是否需要 <strong>WAF 防火牆</strong>（例如為了過資安審核）？如果不需要，用 External 模式可以幫你省下每個月幾千塊的支出。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>既然你的需求是為了**「通過資安審核」**，那麼 <strong>WAF (Web Application Firewall)</strong> 就是必選題了。資安審核（如 ISO 27001, PCI-DSS 或金管會規範）通常要求具備偵測並攔截 SQL Injection、XSS 等攻擊的能力，而 ACA 內建的 Load Balancer 僅提供基本傳輸功能，並不具備這類深層封包檢查（Deep Packet Inspection）的能力。</p>



<p>要達成此目標，你有以下三種主要方案，費用與架構邏輯各不相同：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">方案一：最正規的企業架構 (Application Gateway + WAF v2)</h3>



<p>這是最常見的審核過關配置。你會將 ACA 環境設為 <strong>Internal</strong>（隱藏在私有網段），前端放一個 App Gateway 帶 WAF。</p>



<ul class="wp-block-list">
<li><strong>架構</strong>：外部流量 → App Gateway (WAF) → VNet 內部 → ACA Internal Ingress。</li>



<li><strong>優點</strong>：符合所有資安規範；流量完全不暴露於公網。</li>



<li><strong>缺點</strong>：費用最高（每月至少 NT$ 9,000+ 起）。</li>



<li><strong>審核關鍵</strong>：可以提供詳細的 WAF 攻擊日誌（Logs）給稽核員。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">方案二：性價比高的邊緣防護 (Azure Front Door + WAF)</h3>



<p>如果你的服務不需要完全封鎖在 VNet 內，但需要 WAF 標章，Front Door 是個好選擇。</p>



<ul class="wp-block-list">
<li><strong>架構</strong>：外部流量 → Front Door (WAF) → ACA External Ingress (需設定 IP 限制)。</li>



<li><strong>優點</strong>：全域加速、按流量計費，起步成本比 App Gateway 低。</li>



<li><strong>費用</strong>：固定費約 $35 USD/月 + WAF 策略費，總額通常比 App Gateway 便宜。</li>



<li><strong>審核關鍵</strong>：雖然 ACA 是 External 模式，但透過 <strong>IP Restrictions</strong> 限制只接受 Front Door 的 IP，在邏輯上同樣可以滿足「防護邊界」的要求。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">方案三：最新容器原生方案 (Application Gateway for Containers)</h3>



<p>這是 Azure 2024-2025 年推廣的新產品，專為容器化架構設計。</p>



<ul class="wp-block-list">
<li><strong>特點</strong>：它是傳統 App Gateway 的進階版，與 ACA/AKS 整合更深。</li>



<li><strong>費用架構</strong>：將「控制層」與「轉發層」分離，對於中高流量的環境，費用可能比傳統 v2 更具預測性。</li>



<li><strong>審核關鍵</strong>：同樣支援 WAF 策略。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">資安審核的「加分項」建議</h3>



<p>為了順利通過審核，建議你在設定時同步啟用以下功能：</p>



<ol start="1" class="wp-block-list">
<li><strong>Log Analytics 診斷日誌</strong>：
<ul class="wp-block-list">
<li>WAF 只是防護，資安審核一定要看到<strong>日誌</strong>。請確保將 WAF 的 <code>Access Log</code> 和 <code>Firewall Log</code> 傳送到 Log Analytics 工作區。</li>
</ul>
</li>



<li><strong>封鎖模式 (Prevention Mode)</strong>：
<ul class="wp-block-list">
<li>WAF 預設可能是 <code>Detection</code> (僅偵測)，審核時必須切換到 <code>Prevention</code> (攔截模式) 才算有效。</li>
</ul>
</li>



<li><strong>限制 TLS 版本</strong>：
<ul class="wp-block-list">
<li>在 WAF 設定中強制要求使用 <strong>TLS 1.2 或 1.3</strong>，停用過時的 TLS 1.0/1.1。</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">決策建議</h3>



<ul class="wp-block-list">
<li><strong>如果預算充足且法規極其嚴格（如銀行）</strong>：請選 <strong>方案一 (App Gateway WAF v2)</strong>。</li>



<li><strong>如果想兼顧效能、全球部署且預算中等</strong>：請選 <strong>方案二 (Azure Front Door)</strong>。</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>小撇步</strong>：如果還在開發階段，可以先用 ACA External 模式省錢，等到<strong>審核前一個月</strong>再掛上 App Gateway 並開啟 WAF，這樣可以節省前期的建置成本。</p>
</blockquote>



<p>針對你的資安審核，是否有特定要求「後端服務必須完全不可從公網訪問（Private IP Only）」？這將決定你必須選方案一，還是方案二也可以接受。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">App Gateway, 是可以與多個系統共用?</h2>



<p>答案是 <strong>肯定的</strong>。Azure Application Gateway (App Gateway) 的設計初衷就是為了作為一個「中央閘道器」，能夠同時管理並保護多個不同的後端系統。</p>



<p>這也是為什麼對於有資安審核需求的企業來說，App Gateway 雖然單價高，但透過 <strong>「資源共用」</strong> 可以大幅攤平單一系統的建置成本。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. 如何達成「多系統共用」？</h2>



<p>App Gateway 透過以下兩種核心機制來區分不同的系統流量：</p>



<h3 class="wp-block-heading">A. 多站點代管 (Multi-site Hosting)</h3>



<p>你可以在同一個 App Gateway 上綁定多個網域（Domain）。</p>



<ul class="wp-block-list">
<li><strong>例子</strong>：
<ul class="wp-block-list">
<li><code>app1.yourcompany.com</code> 導向 <strong>ACA 系統 A</strong></li>



<li><code>app2.yourcompany.com</code> 導向 <strong>ACA 系統 B</strong></li>



<li><code>api.yourcompany.com</code> 導向 <strong>虛擬機 (VM) 或 Azure SQL</strong></li>
</ul>
</li>



<li>App Gateway 會根據 HTTP Header 中的 <code>Host</code> 欄位，決定將流量丟給哪一個後端池。</li>
</ul>



<h3 class="wp-block-heading">B. 路徑型路由 (Path-based Routing)</h3>



<p>如果你只有一個網域，也可以根據 URL 的路徑來拆分流量。</p>



<ul class="wp-block-list">
<li><strong>例子</strong>：
<ul class="wp-block-list">
<li><code>website.com/shop/*</code> 導向 <strong>商務系統 (ACA)</strong></li>



<li><code>website.com/blog/*</code> 導向 <strong>部落格系統 (VM/App Service)</strong></li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. 共用時的優點與風險</h2>



<h3 class="wp-block-heading"><strong>優點：節省費用與統一管理</strong></h3>



<ul class="wp-block-list">
<li><strong>攤平固定成本</strong>：原本三個系統要花 3 份 WAF 錢 (約 $288 \times 3 \approx 864$ USD)，現在只需付一份 App Gateway 的錢 ($288$ USD)。</li>



<li><strong>統一 WAF 策略</strong>：你可以在閘道層級統一設定資安規則，確保所有系統都符合同樣的資安審核標準。</li>



<li><strong>憑證管理</strong>：所有系統的 SSL 憑證可以集中在 App Gateway 管理，不需要分開維護。</li>
</ul>



<h3 class="wp-block-heading"><strong>風險：單一故障點 (SPOF)</strong></h3>



<ul class="wp-block-list">
<li><strong>影響範圍廣</strong>：如果 App Gateway 設定錯誤或是發生故障，所有掛載在其後的系統都會同時斷線。</li>



<li><strong>效能競爭</strong>：如果系統 A 流量暴增，雖然 App Gateway 會自動擴展 (Autoscale)，但若沒設定好，可能會影響到系統 B 的反應速度。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. 如何將 ACA 接入共用的 App Gateway？</h2>



<p>當你要將多個系統接入時，架構會變成這樣：</p>



<ol start="1" class="wp-block-list">
<li><strong>VNet 規劃</strong>：
<ul class="wp-block-list">
<li>建立一個 VNet，劃分 <code>Subnet-AppGW</code> (給 Gateway) 和 <code>Subnet-ACA</code> (給 ACA 環境)。</li>
</ul>
</li>



<li><strong>ACA 設定</strong>：
<ul class="wp-block-list">
<li>將 ACA Environment 設為 <strong>Internal</strong>。</li>



<li>ACA 會獲得一個內部的 Load Balancer IP (或是預設的內部 FQDN)。</li>
</ul>
</li>



<li><strong>App Gateway 設定</strong>：
<ul class="wp-block-list">
<li><strong>Backend Pool</strong>：填入 ACA 的內部存取點位址。</li>



<li><strong>HTTP Settings</strong>：這點很重要，因為 ACA 通常需要 <strong>Host Name Override</strong> (後端主機名稱覆寫)，否則請求會被 ACA 拒絕。</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. 費用節省試算</h2>



<p>如果你有 <strong>3 個</strong> 需要過資安審核的獨立應用程式：</p>



<ul class="wp-block-list">
<li><strong>各自獨立使用 WAF (External 模式 + WAF)</strong>：
<ul class="wp-block-list">
<li>這在 ACA 上不可行，因為 ACA 本身沒 WAF。</li>
</ul>
</li>



<li><strong>各自掛載 App Gateway (3 個)</strong>：
<ul class="wp-block-list">
<li>費用：約 <strong>$864 USD/月</strong>。</li>
</ul>
</li>



<li><strong>共用 1 個 App Gateway (1 個)</strong>：
<ul class="wp-block-list">
<li>費用：約 <strong>$300 &#8211; $320 USD/月</strong> (含少量流量費用)。</li>



<li><strong>結論：省下約 65% 的網路支出。</strong></li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">專業建議</h3>



<p>既然你有資安審核需求，<strong>「共用 App Gateway」</strong> 是最聰明的作法。你可以先建立一個足夠規格的 App Gateway (WAF_v2)，然後將目前的所有服務（不論是 ACA、VM 還是 App Service）通通導向它後端。</p>



<p>你目前規劃的系統中，除了 ACA，還有其他類型的服務（例如 SQL 資料庫、Legacy VM）需要一起納入 WAF 的保護範圍嗎？</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">App Gateway, 一定要有 domain name ?</h2>



<p>簡單來說：<strong>技術上不一定，但實務上「強烈建議」要有。</strong></p>



<p>如果你只是為了測試，可以直接用 <strong>IP 位址</strong> 存取；但因為你有 <strong>「資安審核」</strong> 與 <strong>「連接 ACA」</strong> 的需求，<strong>使用 Domain Name 幾乎是強制性的</strong>。</p>



<p>以下是詳細的原因分析：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1. 技術層面：可以用 IP 存取嗎？</h3>



<p>可以。App Gateway 建立後會獲得一個前端公用 IP（Frontend Public IP）。</p>



<ul class="wp-block-list">
<li>你可以直接在瀏覽器輸入 <code>http://20.xx.xx.xx</code>。</li>



<li>但這僅限於最簡單的測試，且不支援 HTTPS（因為 SSL 憑證必須綁定網域）。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 為何連線 ACA「一定」要有 Domain Name？</h3>



<p>當 App Gateway 後端接的是 <strong>Azure Container Apps (ACA)</strong> 時，Domain 變得非常重要：</p>



<ul class="wp-block-list">
<li><strong>ACA 的識別機制</strong>：ACA 環境內部是透過 <code>Host Header</code> 來決定要把流量導向哪一個 Container App。如果 App Gateway 只是丟一個 IP 給 ACA，ACA 會不知道你要找哪一個 App，進而回報 <strong>404 錯誤</strong>。</li>



<li><strong>SNI 與 TLS 握手</strong>：現代的加密連線 (HTTPS) 需要 SNI (Server Name Indication)。如果沒有 Domain，App Gateway 無法與後端的 ACA 建立安全的加密隧道。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 資安審核的考量 (WAF)</h3>



<p>你的目標是通過資安審核，這通常涉及以下要求：</p>



<ul class="wp-block-list">
<li><strong>強制 HTTPS/TLS 加密</strong>：要啟用 HTTPS，你必須有 SSL 憑證，而憑證是頒發給 <strong>Domain (例如 <code>api.yourcompany.com</code>)</strong> 的，不是頒發給 IP 的。</li>



<li><strong>WAF 規則優化</strong>：許多 WAF 規則是基於主機名稱 (Host) 進行過濾的。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 如果多個系統共用，該怎麼辦？</h3>



<p>當你共用同一個 App Gateway 時，Domain 是區分系統的<strong>唯一標準</strong>：</p>



<ul class="wp-block-list">
<li>系統 A：<code>app1.test.com</code> → 導向 ACA-1</li>



<li>系統 B：<code>app2.test.com</code> → 導向 ACA-2</li>



<li>如果只有一個 IP，App Gateway 將無法區分外部請求到底是想找系統 A 還是系統 B。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">5. 沒有預算買網域？解決方案：</h3>



<p>如果你目前還不想購買正式網域，有兩個替代方案：</p>



<ol start="1" class="wp-block-list">
<li><strong>使用 Azure 預設網域</strong>：App Gateway 的公用 IP 可以設定一個 <strong>「DNS 名稱標籤」</strong>（例如 <code>my-gateway.eastasia.cloudapp.azure.com</code>）。這是一個免費且合法的 FQDN，可以用來申請測試用的憑證或進行連線。</li>



<li><strong>修改本地 Hosts 檔案 (僅限開發調試)</strong>：在你的電腦 <code>C:\Windows\System32\drivers\etc\hosts</code> 中，手動將你的測試網域指向 App Gateway 的 IP。這可以騙過瀏覽器進行測試，但無法用於正式環境或資安審核。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">總結</h3>



<p>為了滿足你的 <strong>資安審核</strong> 需求並確保能 <strong>連通 ACA</strong>：</p>



<ul class="wp-block-list">
<li><strong>前端 (Client -> App Gateway)</strong>：必須有 Domain，才能掛載 SSL 憑證。</li>



<li><strong>後端 (App Gateway -> ACA)</strong>：App Gateway 必須設定「主機名稱覆寫 (Host Override)」，指向 ACA 內部的 FQDN。</li>
</ul>



<p>你目前已經有準備好要使用的網域了嗎？還是需要指導如何使用 Azure 提供的免費 <code>cloudapp.azure.com</code> 名稱？</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Web App, 也會有 vnet 存取內網與 public IP 的問題?</h2>



<p>是的，<strong>Azure App Service (Web App)</strong> 面對網路架構時，邏輯與 ACA 非常相似，但其「虛擬網路整合」的方式稍有不同。</p>



<p>Web App 本質上也是一個多租戶（Multi-tenant）服務，預設是走公網。若要存取內網或限制外部存取，同樣需要處理「流入」與「流出」兩個方向。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. Web App 的雙向網路邏輯</h2>



<p>在 Web App 中，存取內網與對外公開 IP 的問題通常拆解為兩部分：</p>



<h3 class="wp-block-heading">A. 流出 (Outbound)：Web App 存取內網資源</h3>



<p>當你的 Web App 需要連線到同一個 VNet 內的 SQL Server 或 VM 時：</p>



<ul class="wp-block-list">
<li><strong>解決方案</strong>：<strong>VNet Integration (虛擬網路整合)</strong>。</li>



<li><strong>邏輯</strong>：這會配置一個子網給 Web App 使用，讓 Web App 的「出口」流量進入你的 VNet。</li>



<li><strong>注意</strong>：這並不代表你的 Web App 就此變成私有的，它預設仍然有一個公用 IP 可以從外面連進來。</li>
</ul>



<h3 class="wp-block-heading">B. 流入 (Inbound)：限制誰能連到 Web App</h3>



<p>如果你不希望 Web App 被公網直接存取（為了過資安審核）：</p>



<ul class="wp-block-list">
<li><strong>解決方案</strong>：<strong>Private Endpoint (私有端點)</strong>。</li>



<li><strong>邏輯</strong>：這會給你的 Web App 一個 VNet 內部的私有 IP。一旦啟用，原本的公用 IP 就會失效（或被拒絕存取）。</li>



<li><strong>搭配 WAF</strong>：此時你同樣需要 <strong>App Gateway</strong> 放在最前端，透過私有 IP 轉發流量給 Web App。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. Web App 與 ACA 的對比</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>特性</strong></td><td><strong>Azure Container Apps (ACA)</strong></td><td><strong>Azure App Service (Web App)</strong></td></tr></thead><tbody><tr><td><strong>環境邊界</strong></td><td>建立在 Environment (環境) 層級</td><td>建立在 App Service Plan 層級</td></tr><tr><td><strong>IP 資源消耗</strong></td><td>較大 (需要一整個子網段)</td><td>較小 (每個 App 整合僅佔用少數 IP)</td></tr><tr><td><strong>VNet 整合難度</strong></td><td>建立環境時就要決定，事後難改</td><td>隨時可以開啟或關閉 VNet 整合</td></tr><tr><td><strong>預設網路</strong></td><td>依環境設定 (Internal/External)</td><td>預設為 Public (需手動加 Private Endpoint)</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. Web App 同樣會遇到 Public IP 的問題嗎？</h2>



<p><strong>是的，而且更具迷惑性。</strong></p>



<ol start="1" class="wp-block-list">
<li><strong>公用輸出 IP (Outbound IP)</strong>：即便你沒設定 VNet 整合，Web App 也有幾組固定的公用出口 IP。如果你的後端資料庫（例如在地端或其他雲端）有白名單限制，你需要把這幾組 IP 加進去。</li>



<li><strong>資安審核的挑戰</strong>：Web App 的預設網址是 <code>*.azurewebsites.net</code>，這是對全網路公開的。<strong>資安審核通常不允許這個網址直接暴露</strong>。
<ul class="wp-block-list">
<li><strong>解法</strong>：開啟「存取限制 (Access Restrictions)」，只允許 App Gateway 的 IP 存取；或者直接關閉公網存取，改用 Private Endpoint。</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. 總結：Web App 還是 ACA？</h2>



<p>如果你已經決定要用 <strong>App Gateway + WAF</strong> 來過審核：</p>



<ul class="wp-block-list">
<li><strong>選 Web App 的理由</strong>：你只需要運行單一 Web 程式，不想要管理複雜的容器環境，且希望網路設定更彈性（可以隨時插拔 VNet）。</li>



<li><strong>選 ACA 的理由</strong>：你有複數個小服務（Microservices）要互相溝通，或者你的程式本來就是高度容器化的，ACA 的自動擴展（KEDA）比 Web App 更強大且便宜（支援縮減至 0 份複本）。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">您目前的選擇考量</h3>



<p>您提到 Web App 是因為覺得 ACA 的網路設定太複雜嗎？</p>



<p>Web App 在設定 Private Endpoint + App Gateway 時，雖然步驟多，但每一層的邏輯比 ACA 的 Environment 稍微透明一點。</p>



<p>您是否需要將 <strong>多個 Web App</strong> 同時掛在同一個 App Gateway 下來省錢？（這在 Web App 也是完全可行的）</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">以不需要分析log 與防火牆的小系統來看, web app 直接存取 vnet 裡的資源, 是否有資安上的風險?</h2>



<p>在「不需要通過嚴格資安審核」且「不需分析 Log」的前提下，讓 Web App 直接存取 VNet 資源是常見的做法。但從純粹的資安角度來看，<strong>「風險」依然存在，只是嚴重程度取決於你的配置方式。</strong></p>



<p>以下從三個關鍵面向分析可能的風險：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. 「流出 (Outbound)」的風險：VNet 整合</h2>



<p>當你開啟 <strong>VNet Integration</strong> 讓 Web App 存取內網（如 SQL 或 VM）時：</p>



<ul class="wp-block-list">
<li><strong>單向透明度</strong>：預設情況下，這是<strong>單向</strong>的。Web App 可以看到 VNet 內部，但 VNet 內部的機器無法主動連回 Web App。這部分風險較低。</li>



<li><strong>橫向移動 (Lateral Movement)</strong>：這是最大的潛在風險。如果你的 Web App 程式碼有漏洞（例如被植入 WebShell），攻擊者可以利用這個 Web App 作為「跳板」，攻擊你 VNet 內部的其他資源。
<ul class="wp-block-list">
<li><em>解決方案</em>：在 VNet 的子網上設定 <strong>網路安全性組群 (NSG)</strong>，嚴格限制 Web App 只能存取特定的 IP 和 Port（例如只允許連線到資料庫的 1433 Port）。</li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. 「流入 (Inbound)」的風險：公網入口</h2>



<p>即便 Web App 正在存取內網，它預設的 <code>*.azurewebsites.net</code> <strong>依然是在公網上公開的</strong>。</p>



<ul class="wp-block-list">
<li><strong>暴露於自動掃描</strong>：全球的黑客機器人每天都在掃描 Azure 的公用網域名稱。如果你的 Web App 沒有做任何存取限制，你的程式碼漏洞（如未經授權的 API）就直接暴露在危險中。</li>



<li><strong>繞過內網防護</strong>：如果你認為「反正我的資料庫在內網很安全」，但 Web App 卻是公開的且有 SQL Injection 漏洞，攻擊者依然可以透過 Web App 偷走內網資料庫的資料。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. Web App vs. ACA 在此情境下的安全差異</h2>



<p>如果你使用 <strong>ACA (External)</strong> 或 <strong>Web App (預設)</strong>：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>比較項目</strong></td><td><strong>Web App (直接存取 VNet)</strong></td><td><strong>ACA (External 模式)</strong></td></tr></thead><tbody><tr><td><strong>預設防護</strong></td><td>只有基礎 DDoS 防護</td><td>只有基礎 DDoS 防護</td></tr><tr><td><strong>隔離性</strong></td><td>較弱，多租戶環境共享</td><td>較強，環境有獨立邊界</td></tr><tr><td><strong>存取控制</strong></td><td>需要手動設定 Access Restrictions</td><td>需要手動設定 IP Restrictions</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. 關鍵安全風險檢查清單 (即使是小系統)</h2>



<p>如果你不打算用 App Gateway/WAF，建議至少做到以下幾點，以規避基本風險：</p>



<ol start="1" class="wp-block-list">
<li><strong>IP 存取限制 (Access Restrictions)</strong>：
<ul class="wp-block-list">
<li>如果這個系統只是內部同仁使用，請在 Web App 的「網路」設定中，加入公司外部 IP 的白名單，封鎖其他所有國家的連線。</li>
</ul>
</li>



<li><strong>停用 SCM (Kudu) 介面公網存取</strong>：
<ul class="wp-block-list">
<li>Web App 有個管理後台（<code>*.scm.azurewebsites.net</code>），這通常是攻擊目標。建議將其設定為僅限特定 IP 存取。</li>
</ul>
</li>



<li><strong>使用 Managed Identity (受管理識別碼)</strong>：
<ul class="wp-block-list">
<li><strong>絕對不要</strong>把資料庫帳號密碼寫在 Web App 的設定檔中。使用 Managed Identity 讓 Web App 存取 SQL 或 Key Vault，這樣就算 Web App 被攻破，攻擊者也拿不到明文密碼。</li>
</ul>
</li>



<li><strong>NSG 限制</strong>：
<ul class="wp-block-list">
<li>在 Web App 整合的那個子網（Subnet）掛上 NSG，限制它「只能」往哪裡跑。</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">總結建議</h3>



<p>對於「小系統」來說，<strong>最大的風險通常不是來自網路架構，而是來自「公開的 Ingress (入口)」</strong>。</p>



<ul class="wp-block-list">
<li><strong>最低限度做法</strong>：使用 Web App + VNet Integration，但務必在 Web App 設定中開啟 <strong>Access Restrictions (存取限制)</strong>，只允許特定 IP 進入。</li>



<li><strong>如果不做 IP 限制</strong>：那就像是把內網資料庫的鑰匙插在門口，只鎖了一層薄薄的紗窗。</li>
</ul>



<p>你目前的這個小系統，使用者是「一般大眾」還是「公司內部員工」？如果是內部員工，透過 IP 限制就能解決 90% 的安全顧慮。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">使用者是「一般大眾」</h2>



<p>既然使用者是 <strong>「一般大眾」</strong>，這意味著你無法透過 IP 白名單（Access Restrictions）來限制連線，你的 Web App 必須完全暴露在網際網路上。</p>



<p>在這種情況下，即便不使用 WAF，你依然面臨以下兩個主要的資安風險，以及相對應的低成本防護建議：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. 核心風險：內網變「肉墊」</h2>



<p>當 Web App 同時擁有 <strong>「公網入口」</strong> 且 <strong>「整合內網 (VNet)」</strong> 時，它就成了內網最脆弱的邊界。</p>



<ul class="wp-block-list">
<li><strong>風險情境</strong>：如果你的程式碼存在上傳漏洞或遠端執行漏洞（RCE），駭客攻入 Web App 後，因為該 Web App 已整合進 VNet，駭客可以像進到你家客廳一樣，直接掃描並攻擊你家臥室（內網裡的資料庫、其他 VM、或是內部 API）。</li>



<li><strong>如何防範（不花大錢）</strong>：
<ul class="wp-block-list">
<li><strong>實施 NSG 隔離（關鍵！）</strong>：在 Web App 整合的 Subnet 上設定 <strong>網路安全性組群 (NSG)</strong>。</li>



<li><strong>規則設定</strong>：禁止該 Subnet 存取 VNet 內的所有 IP，<strong>僅排除</strong>必要的資料庫 IP 與 Port。</li>



<li>這能確保萬一 Web App 被駭，駭客也無法在你的內網橫向移動。</li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. 公共存取風險：資源耗盡與攻擊</h2>



<p>因為對象是「一般大眾」，你無法預測流量來源。</p>



<ul class="wp-block-list">
<li><strong>風險情境</strong>：
<ol start="1" class="wp-block-list">
<li><strong>DDoS/暴力破解</strong>：雖然 Azure 有基本 DDoS 防護，但它不防範應用層（L7）的攻擊，例如頻繁刷 API 導致你的 Web App 算力耗盡，產生高額費用。</li>



<li><strong>SQL 注入 (SQLi)</strong>：沒有 WAF 幫你過濾 SQL 指令，你必須 100% 依賴工程師的程式碼寫得夠安全（例如使用參數化查詢）。</li>
</ol>
</li>



<li><strong>如何防範（不花大錢）</strong>：
<ul class="wp-block-list">
<li><strong>API Throttling (速率限制)</strong>：在程式碼層級或使用 <strong>Azure API Management (Consumption Tier)</strong> 來限制單一 IP 的請求頻率。</li>



<li><strong>Managed Identity</strong>：確保 Web App 存取資料庫時不使用帳密，而是使用 Identity 認證，防止連線字串外洩。</li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. 建議的「最小可行性」安全架構</h2>



<p>如果你決定暫時不買 App Gateway (WAF)，建議採取以下架構來平衡成本與安全：</p>



<ol start="1" class="wp-block-list">
<li><strong>Web App + VNet Integration</strong>：用於存取內網。</li>



<li><strong>強制 HTTPS 轉向</strong>：在 Azure 入口設定中開啟「僅限 HTTPS」。</li>



<li><strong>啟用最低 TLS 版本</strong>：限制為 TLS 1.2 以上。</li>



<li><strong>子網 NSG</strong>：嚴格限制 Web App 只能往哪跑。</li>



<li><strong>Azure Front Door (Standard)</strong> (可選)：
<ul class="wp-block-list">
<li>雖然它要錢（約 $35 USD/月），但它比 App Gateway 便宜很多。</li>



<li>它能提供基礎的邊界防護與全球加速，適合面對「一般大眾」的場景。</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. 總結：資安與風險的權衡</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>「如果不分析 Log 也沒有 WAF，安全嗎？」</strong></p>



<p><strong>老實說：這是不透明的安全。</strong> 當攻擊發生時，你既不會收到警報，事後也無從查起。對於面對一般大眾的系統，這存在一定的「運氣成分」。</p>
</blockquote>



<p><strong>我的具體建議：</strong></p>



<p>既然對象是大眾，且要存取內網資源，請務必至少設定好 <strong>NSG (網路安全性組群)</strong>。這不需要額外付費，卻是防止小災難變成大浩劫（資料庫被搬空）的最重要防線。</p>



<p>既然這個系統要面對大眾，你是否有預期大約會有多少同時在線人數？這會影響到你是否需要考慮基本的負載平衡或防護層級。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>對於 <strong>400 人</strong> 規模的系統（假設是同時在線或每日活躍用戶），這屬於一個「中小型但已有基本規模」的應用。在 Azure 上，這是一個非常尷尬的平衡點：<strong>流量大到需要考慮穩定性，但可能還沒大到想支付每個月台幣 5,000 元以上的 App Gateway 費用。</strong></p>



<p>針對這個規模，且使用者是「一般大眾」，我為你整理了三種不使用 App Gateway 的安全加固策略：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. 網路層級的「斷開」 (Zero Cost)</h2>



<p>既然 Web App 必須開給大眾，而你又需要連回 VNet 存取資料庫，最危險的就是 Web App 被當成進入內網的跳板。</p>



<ul class="wp-block-list">
<li><strong>實作 NSG (網路安全性組群)</strong>：在 Web App 整合的子網上，設定一條「拒絕所有」的規則，然後只針對資料庫的 IP 開放特定的 Port。</li>



<li><strong>優點</strong>：即使程式碼被駭，駭客也無法掃描你 VNet 裡的其他 VM 或資源。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. 入口層級的「隱身」 (Low Cost)</h2>



<p>如果你不想花大錢買 App Gateway，但又擔心 <code>*.azurewebsites.net</code> 被人掃描，可以考慮 <strong>Azure Front Door (Standard)</strong>。</p>



<ul class="wp-block-list">
<li><strong>費用</strong>：大約 <strong>$35 USD/月</strong> (約 NT$ 1,100)。</li>



<li><strong>做法</strong>：
<ol start="1" class="wp-block-list">
<li>流量先經過 Front Door。</li>



<li>在 Web App 的 <strong>Access Restrictions</strong> 中，設定只允許來自 Front Door 的標籤（Service Tag: <code>AzureFrontDoor.Backend</code>）進入。</li>
</ol>
</li>



<li><strong>好處</strong>：這能隱藏你的 Web App 原始位址，並提供基礎的 L3/L4 DDoS 防護。對於 400 人的規模，這比 App Gateway 划算得多。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. 程式碼與驗證層級的「鎖頭」 (Zero Cost)</h2>



<p>面對大眾時，最容易被攻擊的是 API 接口。</p>



<ul class="wp-block-list">
<li><strong>驗證機制 (Easy Auth)</strong>：如果這 400 人需要登入，直接利用 Azure App Service 內建的 <strong>Authentication (Entra ID / Google / Facebook)</strong>。這能確保未經授權的人連你的程式碼邏輯都碰不到。</li>



<li><strong>HTTPS 封閉循環</strong>：確保 <code>HTTPS Only</code> 是開啟的，且停用所有不安全的連線。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. 給你的最終建議架構</h2>



<p>對於 400 人規模且要過資安基本門檻的系統，建議採用：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>層級</strong></td><td><strong>推薦配置</strong></td><td><strong>成本</strong></td></tr></thead><tbody><tr><td><strong>入口</strong></td><td><strong>Web App (Public)</strong> + <strong>Access Restrictions</strong></td><td>$0</td></tr><tr><td><strong>防護</strong></td><td><strong>Azure Front Door (Standard)</strong> (視預算而定)</td><td>~$35 USD/月</td></tr><tr><td><strong>內網存取</strong></td><td><strong>VNet Integration</strong> + <strong>NSG (限制輸出流量)</strong></td><td>$0</td></tr><tr><td><strong>認證</strong></td><td><strong>Managed Identity</strong> (存取 SQL 不用密碼)</td><td>$0</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">為什麼這能過「小規模」的審核？</h3>



<p>雖然你沒有專業的 WAF 分析 Log，但你做到了 <strong>「最小權限原則 (Least Privilege)」</strong>：</p>



<ol start="1" class="wp-block-list">
<li><strong>外網進不去內網</strong> (由 NSG 擋掉)。</li>



<li><strong>Web App 拿不到資料庫帳密</strong> (由 Managed Identity 處理)。</li>



<li><strong>入口流量有基本過濾</strong> (由 Front Door 或 Access Restrictions 處理)。</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>總結：</strong> 400 人規模建議先用 <strong>Web App + VNet Integration + NSG</strong> 撐住，並將省下來的錢花在 <strong>Azure SQL 的備份與加密</strong>上。</p>
</blockquote>



<p>你目前資料庫是使用 <strong>Azure SQL Database</strong> 嗎？如果是的話，別忘了開啟 <strong>Microsoft Defender for SQL</strong>，它能幫你偵測 SQL Injection，某種程度上能彌補沒有 WAF 的缺憾。</p>



<p>針對這 400 人的存取，你有打算讓他們使用特定的登入方式嗎？</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">與 vnet 內網裡的 portal 系統 進行 oauth, 驗證使用者身份</h2>



<p>對於這 400 人要與 VNet 內網裡的 Portal 系統進行 OAuth 驗證，這是非常關鍵的步驟。因為你的對象是「一般大眾」，但驗證對象（Portal 系統）卻在「內網」，這會涉及一個核心矛盾：<strong>外網的使用者如何與內網的認證服務溝通？</strong></p>



<p>在不使用 App Gateway 的前提下，以下是針對此場景的專業建議架構：</p>



<h3 class="wp-block-heading">1. 核心邏輯：區分「認證流量」與「資料流量」</h3>



<p>你必須確保 OAuth 的流量能安全地穿透外網到達內網。這裡有兩種實踐方式：</p>



<h4 class="wp-block-heading">方案 A：Web App 擔任「代理人」 (最推薦)</h4>



<p>這是最安全的做法，不直接暴露內網 Portal。</p>



<ol start="1" class="wp-block-list">
<li><strong>流程</strong>：一般大眾訪問公網 Web App -> Web App 發現未登入 -> Web App 透過 <strong>VNet Integration</strong> 在後端與內網 Portal 通訊。</li>



<li><strong>關鍵點</strong>：Web App 設定為 <strong>Confidential Client</strong>。所有的 OAuth 交換（Client Secret, Code Exchange）都在後端（內網）完成，不經過使用者的瀏覽器直接接觸內網。</li>



<li><strong>安全性</strong>：使用者的瀏覽器只會看到公網 Web App，永遠看不到內網 Portal 的 IP 或網址。</li>
</ol>



<h4 class="wp-block-heading">方案 B：使用 Private Endpoint + 轉發 (需考量連通性)</h4>



<p>如果你的 OAuth 流程（例如 Authorization Code Flow）需要使用者的瀏覽器直接「重新導向 (Redirect)」到 Portal 的網址：</p>



<ol start="1" class="wp-block-list">
<li><strong>挑戰</strong>：使用者的瀏覽器在公網，無法解析或連線到 <code>10.x.x.x</code> 這種內網位址。</li>



<li><strong>解法</strong>：你必須在 Web App 上設定 <strong>Reverse Proxy (反向代理)</strong>，或者在前端掛一個可以處理轉發的服務（如 Azure Front Door），將特定路徑（如 <code>/login</code>）轉導進 VNet。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 資安防護建議：如何保護內網 Portal？</h3>



<p>既然要進行身份驗證，Portal 系統就是最高機密。即使是小系統，也建議做到以下防範：</p>



<ul class="wp-block-list">
<li><strong>實施 NSG 嚴格限縮</strong>：
<ul class="wp-block-list">
<li>內網 Portal 系統所在的子網，其 NSG 必須設定：<strong>僅允許來自 Web App 子網的流量</strong>。</li>



<li><strong>禁止</strong>所有其他內網機器或外網 IP 直接存取 Portal。</li>
</ul>
</li>



<li><strong>使用受管理識別碼 (Managed Identity)</strong>：
<ul class="wp-block-list">
<li>讓 Web App 存取 Portal 時，不需要在 App 設定中儲存 API Key 或密碼。</li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 針對 400 人規模的建議實作：Easy Auth</h3>



<p>如果你的內網 Portal 支援 <strong>OpenID Connect (OIDC)</strong>，強烈建議使用 Azure App Service 內建的 <strong>Authentication (Easy Auth)</strong>：</p>



<ol start="1" class="wp-block-list">
<li><strong>設定</strong>：在 Web App 的「驗證」頁面中，新增一個「自訂 OpenID Connect 供應商」。</li>



<li><strong>中繼設定</strong>：由於供應商（Portal）在內網，請在 Web App 設定中開啟 <code>vnetRouteAll: true</code>。</li>



<li><strong>優點</strong>：你不需要寫任何驗證程式碼，Azure 平台會自動幫你處理與內網 Portal 的握手（Handshake），並確保未登入的人連 Web App 的頁面都進不去。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 潛在風險提示</h3>



<ul class="wp-block-list">
<li><strong>DNS 解析問題</strong>：Web App 能否找到內網 Portal？你可能需要設定 <strong>Azure Private DNS Zone</strong>，並將其連結到 VNet，這樣 Web App 才能解析出 Portal 的私有網址（如 <code>portal.internal</code>）。</li>



<li><strong>回傳網址 (Redirect URI)</strong>：在 OAuth 註冊中，Redirect URI 必須是<strong>公網 Web App 的位址</strong>（如 <code>https://your-app.azurewebsites.net/.auth/login/custom/callback</code>），否則使用者的瀏覽器跳轉時會找不到路。</li>
</ul>



<h3 class="wp-block-heading">總結架構建議</h3>



<p>針對 400 人的一般大眾系統：</p>



<ol start="1" class="wp-block-list">
<li><strong>Web App</strong>：作為唯一公網入口。</li>



<li><strong>VNet Integration</strong>：導引流量進入內網。</li>



<li><strong>NSG</strong>：封閉 Portal，僅限 Web App 存取。</li>



<li><strong>Easy Auth (OIDC)</strong>：簡化程式碼並強化安全性。</li>
</ol>



<p>這套架構在不增加 App Gateway 成本的情況下，提供了極高的安全性，且足以應付 400 人的流量。</p>



<p>你目前內網的 Portal 系統是用什麼技術開發的（例如：IdentityServer, Keycloak, 或是自研 API）？這會決定我們如何配置 OIDC 的中繼資料。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2026/04/azure-container-apps-vnet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
