https://blog.alantsai.net/
Alan Tsai 的學習筆記
2024
2024-02-07T08:04:39Z
為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴
https://blog.alantsai.net/posts/2024/02/review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel
回顧一下 .NET Conf Taiwan 2023 提到的 Generative AI 的衝擊和應對準備
2024-02-03T19:00:00Z
<p>不知不覺距離上次的 .NET Conf Taiwan 2023 已經經歷了將近 2 個月了</p>
<p>這 2 個月以來 Generative AI 這個領域發展的速度一如既往的快速,並且 ChatGPT 剛好也進入 1 週年</p>
<p>想要藉著這個機會整理一下 .NET Conf Taiwan 2023 談的內容,以及如果想要準備好面對這個 Generative AI 的浪潮可以做什麼準備</p>
<!--more-->
<h2 id="generative-ai">Generative AI 含義是什麼?</h2>
<p>Generative AI(生成式 AI)想必大家都不陌生 (畢竟被轟炸了 1 年)</p>
<p>一言蔽之,就是我們透過自然語言的方式讓 Large Language Model (LLM) 幫我們產生/生成出內容。不管是要生成文字、圖片還是程式碼都難不到它</p>
<p>所以,只要任何的應用程式透過 LLM 產生出內容都可以稱之為 Generative AI Application</p>
<p>目前成功的 Generative AI Application 有:</p>
<ol>
<li>ChatGPT - 背後透過使用 OpenAI 的 GPT 模型,透過用 Chat 的方式來和使用者互動,達到解決一般性問題</li>
<li>GitHub Copilot - 背後透過使用 OpenAI 的 GPT 模型,透過整合到 Editor/IDE 的方式,來解決工程師在寫 Code 的過程遇到的問題</li>
</ol>
<p>效益不用說,在去年上半年經過 ChatGPT 的應用轟炸,相信大家對於他的幫助深有體會,從會議記錄整理,到學習東西的溝通,全部都難不倒他,只有要注意他的方向對不對,以及有沒有胡說八道而已 XD</p>
<p>到了 GitHub Copilot 更不用說太多的調查顯示不止加速開發、品質更好並且可以讓大家技能提升</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207082916-wen0ycs.png" class="img-responsive img-fluid" alt="永豐銀行的案例分享" title="永豐銀行的案例分享" /></p>
<p>Generative AI 相較於以往任何的技術、功法、軟體等都不一樣,大家使用起來的提升是非常顯著,就算沒有真的深入了解,只要把它當成一個<mark>不懂得思考但是很會做事</mark>的同事,只要把要做什麼明確告訴他,他就可以幫你完成最少 70~80%,同等於節省掉了非常大量時間</p>
<p>這個和以往任何都不一樣,以往都是要從概念發酵到實作導入,往往都是以<mark>年</mark>為單位來計算。隨便舉例,Cloud Skill,或者 DevOps 花了多少時間才到目前我們現在這種算人人都認可的做法。從認可到實際應用又要過了多久。而 ChatGPT 以及 GitHub Copilot 花了不到 1 年的時間基本上霸榜了所有東西</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207083411-nakv7n6.png" class="img-responsive img-fluid" alt="相信大家都看過這個梗圖 ChatGPT 或者 GitHub Copilot 就是那麼神,是服務什麼時候可以買的問題,而不是為什麼要花多少錢的問題" title="相信大家都看過這個梗圖 ChatGPT 或者 GitHub Copilot 就是那麼神,是服務什麼時候可以買的問題,而不是為什麼要花多少錢的問題" /></p>
<p>以我和企業做交流的結論來說,也是在於怎麼可以用好,而不是該不該花錢買的這件事。</p>
<p>在去年下半年跑了不同產業並且培訓近 800 人次的不同的反饋來說,我認為最具代表性就是,下面那句話:</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207083933-5yxxe3c.png" class="img-responsive img-fluid" alt="公司可以買github copilot給開發者使用嗎" title="公司可以買github copilot給開發者使用嗎" /></p>
<p>所以 Generative AI 已經讓整個世界進入了另外一個領域,並且目前這個領域屬於一個大家都不能夠肯定什麼叫對的時候</p>
<p>那我們作為生化在這個當下的人,應該可以先做什麼來準備好自己搭上這個浪潮?</p>
<p>就像小米創辦人雷軍說的「站在風口上,豬都會飛」,不藉著這個機會把自己準備好要等到什麼時候?</p>
<p>在目前這個當下,有兩個層面的問題是作為工程師可以加強:</p>
<ol>
<li>怎麼會用 Generative AI Application?</li>
<li>怎麼會用 LLM 來開發出 Generative AI Application?</li>
</ol>
<h2 id="generative-ai-application">怎麼會用 Generative AI Application?</h2>
<p>10 年前,我們會說要懂雲(Cloud Computing)的概念,因為雲的出現,很多的工作模式會變換</p>
<p>10 年後,已經很少人會說雲不重要,因為它是一切的基礎。變成有點像水和電,你不會感覺他的重要性,直到台電或台水說要停電或停水,這時候我們才會發現有多不方便</p>
<p>那今天我們要會的是什麼?</p>
<p>答案很簡單怎麼用好 Generative AI。更準確一點說怎麼用好 Generative AI 的 Application 來完成你的日常</p>
<p>當以前會議記錄要 1 小時可以整理好,現在會議開完不到 5 分鐘就可以條例清楚並格式都符合公司規範,這個效益提升是非常巨大</p>
<p>到工程師的世界,我認為會進入一個一人成軍的年代</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207084916-zqtar97.png" class="img-responsive img-fluid" alt="1 位工程師透過 Generative AI Application 在不到 1 天就把 Angry Bird 翻版變成 Angry Pumpkin" title="1 位工程師透過 Generative AI Application 在不到 1 天就把 Angry Bird 翻版變成 Angry Pumpkin" /></p>
<p>Junior 工程師的門檻會變低,因為要懂怎麼寫 Code 不在困難</p>
<p>Senior 工程師的工作形態會有變化,因為他會變成只需要會<mark>指導</mark> Generative AI Application 去做事就對了</p>
<p>因此,Senior 的經驗和判斷能力變的更重要,因為他要能夠正確的<mark>指導</mark> Generative AI Application 怎麼做叫做對,以及當 Generative AI Application 胡說八道的時候,<mark>要能夠識別的出來</mark></p>
<p>而指導的方式就是我們常常戲稱的下咒語,Prompt Engineering</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207085519-bjrnweb.png" class="img-responsive img-fluid" alt="Prompt Engineering - Example 的技巧" title="Prompt Engineering - Example 的技巧" /></p>
<p>一個好的 Generative AI Application 應該<mark>不需要使用者</mark>需要懂 Prompt Engineering 的技巧就可以完成想做的事情</p>
<p>Prompt Engineering 應該是要整合在 Application 裡面</p>
<p>這個部分 GitHub Copilot 做的就很好,在不了解太多 Prompt Engineering 的情況下他的幫助就非常大</p>
<p>但是,如果你懂更多技巧,那麼讓他運作更好的機會更大</p>
<p>Generative AI 的 Application 某種程度上和你要交辦工作請人處理是一樣的道理</p>
<p>今天你給的描述夠精準,請人完成的幾率就越高</p>
<p>因此你的溝通技巧越好(Prompt Engineering),那麼你請的人(Generative AI Application 或者說 LLM 模型)完成<mark>符合你預期</mark>的機會就越大</p>
<p>所以,從用的角度來說,請把 Generative AI Application 當成是一個<mark>技術能力很好,但是不會思考的工程師</mark></p>
<p>同樣一個模糊的描述,在某天它心情好,就會幫你多想給的答案可能更圓滿,但是它心情不好就可能不會想那麼多</p>
<p>那業界目前面對不怎麼思考的工程師或者比較資淺的工程師是怎麼解決這種問題呢?</p>
<p>敏捷開發重要的會議之一就是 Planning,其中就有一個概念就是 Definition of Done (DoD),如果今天 DoD 模糊,資深的工程師會知道要問清楚,資淺的工程師可能埋頭就下去做後面才發生問題</p>
<p>會發現和使用 Generative AI Application 一模一樣。寫的清楚,它歪掉的幾率就會下降,但是還有可能歪掉,那就是適時的提醒它忘記了什麼和漏掉了什麼</p>
<p>總結來說:</p>
<ol>
<li>把它當成很會做事,但是不會思考的人。如果請他做事會怎麼描述避免他不思考而漏掉</li>
<li>使用越標準的東西越好。因為越標準代表用的人越多,它就越容易理解你在說什麼</li>
</ol>
<h2 id="llm-generative-ai-application">怎麼會用 LLM 來開發出 Generative AI Application?</h2>
<p>會用 Generative AI Application 是為了加速開發,那作為工程師要怎麼開發 Generative AI Application 呢?</p>
<ol>
<li>結構和框架 - Copilot 和 Semantic Kernel</li>
<li>標準化是關鍵 - API 好不好變得更加重要</li>
<li>與傳統軟體開發的不同</li>
</ol>
<h3 id="copilot-semantic-kernel">結構和框架 - Copilot 和 Semantic Kernel</h3>
<p>Generative AI Application 的核心能力來自於 LLM 的 Model,而 Model 訓練起來費用成本非常高</p>
<p>那假設今天想產生出來的內容要依據公司規範,或者某些資料那怎麼辦,因此就有所謂的 4 種模式:</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207091653-e9w0d8f.png" class="img-responsive img-fluid" alt="使用 LLM 模型的 4 種模式" title="使用 LLM 模型的 4 種模式" /></p>
<p>對我們工程師來說,Prompt Engineering 和 Retrieval Augemented Generation (RAG) 是可以下手的地方</p>
<p>Fine Tune 和 Train Model 更偏資料科學一點</p>
<p>那如果我們想做到可以怎麼做?</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207091834-zox2g4z.png" class="img-responsive img-fluid" alt="GitHub 提出的 LLM 架構" title="GitHub 提出的 LLM 架構" /></p>
<p>微軟更進一步的佈局並且把這種 Generative AI Application 統稱為 Copilot</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207091937-9qr33s2.png" class="img-responsive img-fluid" alt="What is Copilot" title="What is Copilot" /></p>
<p>重點就兩個:</p>
<ol>
<li>使用 LLM 模型</li>
<li>整合到應用 => 因此更多看到會是用 Chat 的形式</li>
</ol>
<p>Chat 形式我就不多談,在 2018 年就談過 Conventional AI (Chat) 是所謂的下一代的操作體驗,讓我們從<mark>需要知道如何操</mark>作來完成我們的需求,到<mark>只需要描述需求</mark>和不用在意過程如何執行的一個體感上的差異(有興趣可以參考:[<a href="/posts/2018/07/bot-framework-with-ai-cognitive-service-1-introduction-what-is-caap-why-learn-bot-framework-and-cognitives-service">chatbot + AI = 下一代操作模式][01]開篇 - CaaP是什麽,爲什麽應該學</a>)</p>
<p></p>
<p>怎麼更好的使用 LLM 模型並且容易重複使用 Prompt Engineering 以及 RAG 作出好的 Generative AI Application?</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207095623-29x03mk.png" class="img-responsive img-fluid" alt="image" title="微軟提出的是會需要一個 AI Orchestrator" /></p>
<p>這個 AI Orchestrator 在微軟的 Solution 就是 <a href="https://learn.microsoft.com/semantic-kernel/overview/?WT.mc_id=AZ-MVP-5003856">Semantic Kernel</a>。簡單理解就微軟體系對標到 <a href="https://www.langchain.com/">LangChain</a> 的同一個 Level 的框架</p>
<p>AI Orchestrator 簡單來說就是串聯 LLM Model 和 Application 之間的橋樑。當使用者問了一個問題,很有可能是好幾個 Plugin (簡單可以理解為能夠重複使用的 Prompt Engineering 和 RAG 的模組)組合在一起做回答</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207101522-k4x9bhz.png" class="img-responsive img-fluid" alt="image" title="使用想做到的事情是透過 ShortPoem 和 StoryGen 兩個 Plugin 組合的結果" /></p>
<p>AI Orchestrator 充當了組裝的角色</p>
<p>Semantic Kernel 也迎來了 1.0 的版本,換句話說,開始從概念變成一個更加有機會使用的東西 (但是還是要提醒,目前還是非常前期的階段,因此很多東西因為有重新命名等原因不一定已經那調整好了)</p>
<p>現在入場學習我認為是一個好的時機,因為 AI Orchestrator 的概念我認為是 Generative AI Application 會需要,至於用什麼就是看技術的選型問題而已</p>
<p>在加上目前文件相對來說有比較完整一點點</p>
<p>但是,還是要提醒,目前還很前期,請預期容易撞墻、文章資訊太舊以及新舊名稱摻雜在一起的狀況</p>
<p></p>
<h3 id="api">標準化是關鍵 - API 好不好變得更加重要</h3>
<p>API 重要性不必說,但是當 Generative AI Application 進來之後,這件事會被放大的更加重要</p>
<p>現在大部分的應用都需要串接一些其他服務才能把碎片內容變成一個使用者好用的資訊</p>
<p>當 Generative AI Application 進來之後,由於它可以幫你呼叫 API,這時候 API 開的好不好就很重要</p>
<p>開的不好的 API,有可能會因此導致你的資料狀態錯誤以及它呼叫的時候錯誤
(這個的詳細可以看參考資料裡面 Andrew 那篇有更完整闡述,以及後面會有另外一篇重新 review 一下 .NET Conf 2023 Taiwan 的 API 場次)</p>
<p>另外一個和標準化有關是開發的習慣</p>
<p>LLM 模型是透過既有 Open Source 內容訓練出來,因此當你的風格和業界標準越一樣,LLM 可以提供的幫助和內容就越大</p>
<h3 id="section">與傳統軟體開發的不同</h3>
<p></p>
<p>最後是 Generative AI 的 Application 模式會和既有軟體開發的模式有很大的不同</p>
<p>以現階段來說(要強調是現階段),整個 LLM 的運作就像是一個黑箱</p>
<p>因此,我稱之為:</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207085612-03ru83p.png" class="img-responsive img-fluid" alt="image" title="Prompt Engineering 是一門玄學" /></p>
<p>這個和我們傳統在開發軟體完全不同在於,傳統軟體是可被預測。你輸入 A 得到 1。不管執行幾次,結果都會一樣,如果不一樣就是 bug</p>
<p>但是,Generative AI Application 是不可預測,也就是說看 LLM 的心情,同一個 Prompt 對同一個 LLM 的 Model,在同一個時間(精準一點說很難做到完全同一個時間)可能會得到不同的結果</p>
<p>整件事就像是一個黑箱,是透過 Trial 和 Error 在開發。因此怎麼精準(或者相對精準控制)就變得很重要啦</p>
<p>如果要類比,我認為和請人做事是一樣的道理</p>
<p>同樣的指令(Prompt)給不同的人(LLM Model)被解讀出來會不一樣</p>
<p>因此,怎麼樣有效率以及有品質的下答指令,讓別人把事情做的如你預期,就是個人技巧問題</p>
<p>(大家有沒有開始發現,從技術問題變成溝通題 XD)</p>
<h2 id="section-1">工商服務</h2>
<p>最後,讓我工商服務一下</p>
<p>針對我們提到的兩個所需要的技能:</p>
<ol>
<li>怎麼可以用的好 GitHub Copilot 來達到程式碼開發的加速以及品質提升</li>
<li>怎麼可以準備往開發自己的 Copilot 之路</li>
</ol>
<p>這兩個主題目前有和 Tibame 合作有個直播課程:<a href="https://to.alantsai.net/c-github-copilot">GitHub Copilot AI賦能開發實戰訓練班</a></p>
<p>剛好這個時間點第一期已經結束,很感謝有參與的人有給了一些反饋</p>
<p>整體來說,這門是一個入門的課程。假設沒接觸過 Generative AI,沒用過 GitHub Copilot 效果會是最好,重點在於幫大家把路鋪好,要在往下鑽研至少不會被基礎概念卡住</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207144248-gg5u23w.png" class="img-responsive img-fluid" alt="很高興大部分的人都有因為課程而得到成長" title="很高興大部分的人都有因為課程而得到成長" /></p>
<h2 id="section-2">結語</h2>
<p>零零總總說了一大堆,其實結論很簡單</p>
<p>要把 Generative AI 的 Application 用的好,把它當成一個不會思考但是能力很強的人。你做思考,他幫你做執行面</p>
<p>當到了這個程度,執行就是語法(Syntax)而已,重點是想要做什麼的那個意義(Semantic)</p>
<p><img src="/posts/2024/02/2024-02-03-review-net-conf-taiwan-2023-github-copilot-generative-ai-semantic-kernel/image-20240207145146-3wbsfl3.png" class="img-responsive img-fluid" alt="Schilace Laws" title="Schilace Laws" /></p>
<h2 id="section-3">參考資料</h2>
<ol>
<li><p><a href="https://columns.chicken-house.net/2024/01/15/archview-llm/">[架構師觀點] 開發人員該如何看待 AI 帶來的改變?</a> | 安德魯的部落格</p>
<ol>
<li>Andrew 把 Generative AI 剖析的很清楚,其實看那篇就好了,我這篇根本不用看 XD</li>
</ol>
</li>
<li><p>Semantic Kernel</p>
<ol>
<li><a href="https://learn.microsoft.com/en-us/semantic-kernel/overview/?WT.mc_id=AZ-MVP-5003856">What is Semantic Kernel?</a> => 官方的參考資料</li>
<li><a href="https://github.com/microsoft/semantic-kernel?WT.mc_id=AZ-MVP-5003856">GitHub Repo</a> => 有滿多 sample 和原始碼可以參考</li>
</ol>
</li>
<li><p><a href="https://www.slideshare.net/alantsai2007/github-copilot-enterprise-copilot-net-conf-2023-taiwan?fbclid=IwAR0lEpAr8TnTnk8j62DnyH_lINdQI2MATmdTalmFP86Lsvcxnd2NbSCQUOk">從 GitHub Copilot 到 Enterprise Copilot:打造符合企業需求的智能開發助手之路</a> => .NET Conf Taiwan 2023 的簡報</p>
</li>
<li><p><a href="https://microsoft.github.io/generative-ai-for-beginners/?WT.mc_id=AZ-MVP-5003856&fbclid=IwAR0WN3pFWReLC1xgLZaWpLzj3gHjRNiO6s8PWdxmxr89dc-D7M2iFiZrClU#/">微軟的 Generative AI for Beginners</a></p>
</li>
<li><p><a href="https://rsvp.withgoogle.com/events/csj-tw-s4?fbclid=IwAR1XPFXhKSUjZTncluw6dlzpXIyWOhuSRpvw2tPUZ1Vh_62dCP1hdcwT9jk">Google 的 Google Cloud 培訓計劃第四季:GenAI 特別篇</a></p>
</li>
<li><p><a href="https://aws.amazon.com/tw/events/taiwan/news/ai-ready/?fbclid=IwAR2zyohEHHY6D-OE1LuSf2JsW-k9scs7WrppVrRX5uSAt6VbZbjm3_SMeOE">AWS 的 AI就緒計畫</a></p>
</li>
</ol>
<p></p>
<p>不知不覺距離上次的 .NET Conf Taiwan 2023 已經經歷了將近 2 個月了</p>
<p>這 2 個月以來 Generative AI 這個領域發展的速度一如既往的快速,並且 ChatGPT 剛好也進入 1 週年</p>
<p>想要藉著這個機會整理一下 .NET Conf Taiwan 2023 談的內容,以及如果想要準備好面對這個 Generative AI 的浪潮可以做什麼準備</p>
https://blog.alantsai.net/posts/2023/05/event-microsoft-build-2023-cloud-skill-challenge-free-microsoft-certification-free-azure-course
免費學習,考證免費!不要錯過微軟 2023 Build 大會的 Cloud Skill Challenge - Bonus 我的 Tibame 課程也能夠免費
2023-05-19T19:00:00Z
<p><img src="/posts/2023/05/2023-05-19-event-microsoft-build-2023-cloud-skill-challenge-free-microsoft-certification-free-azure-course/230520--20230520143832-75qmzdg.png" class="img-responsive img-fluid" alt="免費學習,考證免費!不要錯過微軟 2023 Build 大會的 Cloud Skill Challenge - Bonus 我的 Tibame 課程也能夠免費" title="免費學習,考證免費!不要錯過微軟 2023 Build 大會的 Cloud Skill Challenge - Bonus 我的 Tibame 課程也能夠免費" /></p>
<figure class="figure">
<figcaption class="figure-caption">免費學習,考證免費!不要錯過微軟 2023 Build 大會的 Cloud Skill Challenge - Bonus 我的 Tibame 課程也能夠免費</figcaption>
<p>一年一度的微軟的 Build 大會又來了,每年少不了的就是 Cloud Skill Challenge</p>
<p>既可以學習,又可以免費考取微軟雲端 Azure 的證照,不趁著這個時候開始你的 Azure 專家之旅還要等什麼時候</p>
<p>最多可以節省到將近萬元台幣,怎麼做呢?請看內文</p>
<p><mark>題外話:有人會希望我開 Youtube 帶大家過挑戰內容嗎?如果會,留言告訴我你對那個挑戰有興趣,說不定我就開了</mark></p>
<!--more-->
<h2 id="section">可以節省多少</h2>
<table class="table">
<thead>
<tr>
<th>內容\費用</th>
<th>節省約莫多少費用<br />(台幣)</th>
<th>備註</th>
</tr>
</thead>
<tbody>
<tr>
<td>考證費用</td>
<td>3,800</td>
<td>微軟的 Cloud Skill Challenge</td>
</tr>
<tr>
<td>Tibame 課程<br /></td>
<td>取決於選擇哪門課程<br />最多 5,980<br /></td>
<td>Tibame 的證照活動</td>
</tr>
<tr>
<td>總共省下</td>
<td>9,780</td>
<td></td>
</tr>
</tbody>
</table>
<h3 id="build-cloud-skill-challenge">微軟 2023 Build 的 Cloud Skill challenge</h3>
<p><img src="/posts/2023/05/2023-05-19-event-microsoft-build-2023-cloud-skill-challenge-free-microsoft-certification-free-azure-course/image-20230520144440-t4cavnk.png" class="img-responsive img-fluid" alt="image" title="官方圖片" /></p>
<figcaption class="figure-caption">官方圖片</figcaption>
</figure>
<p>今年度的 Cloud Skill Challenge 相較於往年,適用的 Azure 證照更多,因此更不要錯過這次的好機會</p>
<p>沒有參加過的朋友,基本流程很簡單:</p>
<ol>
<li>先要有個微軟帳號</li>
<li>挑選想要挑戰的路徑(列在下面)</li>
<li>在活動時間內(1 個月)把挑戰路徑內容全部做完</li>
<li>等到活動結束就會把免費證照優惠券給你</li>
<li>記得在優惠券結束前去考試(沒考過的可以參考:[<a href="/posts/2020/04/microsoft-certification-03-how-to-schedule-an-exam-use-az-203-as-example">微軟證照][03]怎麼申請考試</a>)</li>
<li>取得證照,撒花</li>
</ol>
<p>如果跑完整個流程不止可以學習到東西,還可以取得免費考試卷,同等於省下 125 美金(約莫 3,800 台幣)</p>
<p>了解了流程,幫大家整理一下這次活動的懶人包:</p>
<ul>
<li>挑戰時間 :2023-05-23 16:00 ~ 2023-06-20 16:00 (時間是 UTC 哦)</li>
<li>考試券時間:2023-06-30 ~ 2023-09-27</li>
</ul>
<p>不管挑戰幾個項目都只會拿到 1 張優惠券</p>
<p>考試券適用於以下考試:</p>
<p>(考試券是通用的,所以可以挑戰 Azure AI,但是去考 AZ-104 沒問題的哦)</p>
<ol>
<li><a href="https://learn.microsoft.com/certifications/exams/ai-900?WT.mc_id=AZ-MVP-5003856">AI-900: Microsoft Azure AI Fundamentals</a><br />
對應挑戰:<a href="https://learn.microsoft.com/training/challenges?id=12f32cf8-2cd8-42e1-97dd-001b4a042766&WT.mc_id=AZ-MVP-5003856">Microsoft Build:Azure AI 挑戰</a></li>
<li><a href="https://learn.microsoft.com/certifications/exams/az-104?WT.mc_id=AZ-MVP-5003856">AZ-104: Microsoft Azure Administrator</a><br />
對應挑戰:不適用</li>
<li><a href="https://learn.microsoft.com/certifications/exams/az-204?WT.mc_id=AZ-MVP-5003856">AZ-204: Developing Solutions for Microsoft Azure</a><br />
對應挑戰:不適用</li>
<li><a href="https://learn.microsoft.com/certifications/exams/az-305?WT.mc_id=AZ-MVP-5003856">AZ-305: Designing Microsoft Azure Infrastructure Solutions</a><br />
對應挑戰: <a href="https://learn.microsoft.com/training/challenges?id=71858d04-7069-436b-860c-a432f5bf3540&WT.mc_id=AZ-MVP-5003856">Microsoft Build:雲開發挑戰</a></li>
<li><a href="https://learn.microsoft.com/certifications/exams/az-400?WT.mc_id=AZ-MVP-5003856">AZ-400: Designing and Implementing Microsoft DevOps Solutions</a><br />
對應挑戰: <a href="https://learn.microsoft.com/training/challenges?id=a04472a5-f71a-4355-82cc-b5f2748390b3&WT.mc_id=AZ-MVP-5003856">Microsoft Build:DevOps 挑戰</a></li>
<li><a href="https://learn.microsoft.com/certifications/exams/dp-420?WT.mc_id=AZ-MVP-5003856">DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB</a><br />
對應挑戰: <a href="https://learn.microsoft.com/training/challenges?id=486d98ad-0b05-474d-a1ad-8d279a260c9d&WT.mc_id=AZ-MVP-5003856">Microsoft Build:Azure Cosmos DB 開發人員挑戰</a></li>
<li><a href="https://learn.microsoft.com/certifications/exams/pl-400?WT.mc_id=AZ-MVP-5003856">PL-400: Microsoft Power Platform Developer</a><br />
對應挑戰:<a href="https://learn.microsoft.com/training/challenges?id=69681a7d-f052-4034-bf05-19a6dcf1bbec&WT.mc_id=AZ-MVP-5003856">Microsoft Build:Power Platform 開發人員挑戰</a></li>
</ol>
<p>從挑戰為導向的可以參考:<a href="https://www.microsoft.com/en-US/cloudskillschallenge/build/registration/2022?WT.mc_id=AZ-MVP-5003856">The Microsoft Learn Cloud Skills Challenge</a></p>
<p>免責聲明:以上內容僅供參考,請還是以<a href="%5Bhttps://www.microsoft.com/en-us/cloudskillschallenge/build/officialrules/2023?WT.mc_id=AZ-MVP-5003856%5D(https://www.microsoft.com/en-us/cloudskillschallenge/build/officialrules/2023?WT.mc_id=AZ-MVP-5003856)">官方說明為主</a>,如果有發現哪裡有誤歡迎讓我知道</p>
<h3 id="bonus-tibame">Bonus: 搭配 Tibame 活動課程也免費</h3>
<p><img src="/posts/2023/05/2023-05-19-event-microsoft-build-2023-cloud-skill-challenge-free-microsoft-certification-free-azure-course/image-20230520144550-40vic8y.png" class="img-responsive img-fluid" alt="image" title="Tibame 考證活動" /></p>
<figure class="figure">
<figcaption class="figure-caption">Tibame 考證活動</figcaption>
<p>如果覺得看挑戰學習不過癮,容許我工商一下,可以搭配我在 Tibame 的課程學習</p>
<p>只要有考過證照,那麼連 Tibame 的學習費用也全免</p>
<p>如果以 AZ-104 為例,最高可以白嫖到 3,800 + 5,980 = 9,780</p>
<p>Tibame 的順序如下:</p>
<ol>
<li>先在 Tibame 購買有興趣的課程:<a href="https://www.tibame.com/teacher/alantsai">https://www.tibame.com/teacher/alantsai</a></li>
<li>完成 Cloud Skill Challenge 取得免費考試券</li>
<li>考過取得證照</li>
<li>填寫 Tibame 的活動表單:<a href="https://docs.google.com/forms/d/e/1FAIpQLSfsIwELkQslMprzhdymwTxC5JUhbeI8ODkitsTy9uzOQLcFaQ/viewform">https://docs.google.com/forms/d/e/1FAIpQLSfsIwELkQslMprzhdymwTxC5JUhbeI8ODkitsTy9uzOQLcFaQ/viewform</a></li>
</ol>
<p>免責聲明:Tibame 這個屬於【通過認證拿獎金】的活動,詳細請看活動頁的說明:<a href="https://www.tibame.com/eventpage/certificate">https://www.tibame.com/eventpage/certificate</a>。由於不知道何時會結束,因此大家要多注意活動頁</p>
<h2 id="section-1">結語</h2>
<p>這篇簡單介紹了如何能夠取得免費的微軟認證的考試券,以及搭配 Tibame 活動也可以免費取得我的課程</p>
<p>想要開始學習的別錯過這個打好機會</p>
<p><mark>題外話:有人會希望我開 Youtube 帶大家過挑戰內容嗎?如果會,留言告訴我你對那個挑戰有興趣,說不定我就開了</mark></p>
<p></p>
<p></p>
</figure>
<p><img src="/posts/2023/05/2023-05-19-event-microsoft-build-2023-cloud-skill-challenge-free-microsoft-certification-free-azure-course/230520--20230520143832-75qmzdg.png" class="img-responsive img-fluid" alt="免費學習,考證免費!不要錯過微軟 2023 Build 大會的 Cloud Skill Challenge - Bonus 我的 Tibame 課程也能夠免費" title="免費學習,考證免費!不要錯過微軟 2023 Build 大會的 Cloud Skill Challenge - Bonus 我的 Tibame 課程也能夠免費" /></p>
<figure class="figure">
<figcaption class="figure-caption">免費學習,考證免費!不要錯過微軟 2023 Build 大會的 Cloud Skill Challenge - Bonus 我的 Tibame 課程也能夠免費</figcaption>
<p>一年一度的微軟的 Build 大會又來了,每年少不了的就是 Cloud Skill Challenge</p>
<p>既可以學習,又可以免費考取微軟雲端 Azure 的證照,不趁著這個時候開始你的 Azure 專家之旅還要等什麼時候</p>
<p>最多可以節省到將近萬元台幣,怎麼做呢?請看內文</p>
<p><mark>題外話:有人會希望我開 Youtube 帶大家過挑戰內容嗎?如果會,留言告訴我你對那個挑戰有興趣,說不定我就開了</mark></p>
https://blog.alantsai.net/posts/2023/03/faq-difference-between-azure-savings-plans-and-azure-reserved-instances
Azure Savings Plan 和 Azure Reservation (Reserved Instances) 傻傻分不清楚
2023-03-07T19:00:00Z
<p><img src="/posts/2023/03/2023-03-07-faq-difference-between-azure-savings-plans-and-azure-reserved-instances/cover.jpg" class="img-responsive img-fluid" alt="圖片來源:https://pixabay.com/en/despair-alone-being-alone-archetype-513528/" /></p>
<figure class="figure">
<figcaption class="figure-caption">圖片來源:https://pixabay.com/en/despair-alone-being-alone-archetype-513528/</figcaption>
<p>要導入任何服務或者軟體之前,評估它的成本 (費用) 以及效益是說服老闆的最關鍵的一件事。</p>
<p>以 Azure 來說,以前有所謂的 Azure Reservation (Reserved Instance) 可以省到 62% 之多,所以如果有穩定使用的機器規格,不開 Reserved Instance 說不過去。</p>
<p>既然有了它,怎麼還會有另外一個所謂 Savings Plan 呢?</p>
<p>這篇來簡單的探討一下兩個的不同之處,以及什麼時候適合用什麼</p>
<!--more-->
<h2 id="tldr">TL;DR</h2>
<table class="table">
<thead>
<tr>
<th></th>
<th>Azure Reserved Instances</th>
<th>Azure Savings Plans</th>
</tr>
</thead>
<tbody>
<tr>
<td>概觀</td>
<td>預先購買某些機器規格</td>
<td>預先購買特定使用量</td>
</tr>
<tr>
<td>適用服務</td>
<td>VMs、SQL databases、Cosmos DB、etc.</td>
<td>VMs、 dedicated host、 Container Instance、App Service、 Azure<br />Premium Functions<br /></td>
</tr>
<tr>
<td>付款方式</td>
<td>一次性付款、部分預付款或按月付款</td>
<td>一次性付款或按月付款</td>
</tr>
<tr>
<td>持續時間</td>
<td>1 或 3 年</td>
<td>1 或 3 年</td>
</tr>
<tr>
<td>靈活度</td>
<td>指定規格大小和 region</td>
<td>彈性的使用時數和 region</td>
</tr>
<tr>
<td>優惠力度</td>
<td>可以到 72%</td>
<td>可以到 65%</td>
</tr>
<tr>
<td>*折扣只有運算,不包括 License 費用</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="azure-reservation-reserved-instance">什麼是 Azure Reservation (Reserved Instance)</h2>
<p>雲的特性之一是彈性,但是當服務穩定之後,其實不太需要這個彈性度</p>
<p>如果可以把這個彈性度換成運算更加便宜,那麼是不是會更好?</p>
<p>所以,Azure Reservation 的意思是,先提前<mark>買好資源</mark>,因此可以<mark>有些優惠</mark></p>
<p>不是所有都可以提前買好,不過因為最常看到會買的都是 VM 的資源,而在 VM 叫做 Reserved Instance 因此有時候直接稱之為 Reserved Instance</p>
<p><img src="/posts/2023/03/2023-03-07-faq-difference-between-azure-savings-plans-and-azure-reserved-instances/image-20230306190318-ihww5pm.png" class="img-responsive img-fluid" alt="Azure Reservation 可以購買的資源" title="Azure Reservation 可以購買的資源" /></p>
<figcaption class="figure-caption">Azure Reservation 可以購買的資源</figcaption>
</figure>
<p>以下都已 VM 的描述為主(也就是 Reserved Instance 或者 RI):</p>
<ol>
<li>可以買 1~3 年 - 可以提前付或者每個月付。可以節省 41% ~ 62% 的<mark>運算費用</mark>。(不涵蓋 License。License 可以搭配 Azure Hybrid Benefit)</li>
<li>適用的機型會受到當初購買的限制規格。調整規格只能夠<mark>有限度的</mark>在 <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/reserved-vm-instance-size-flexibility?toc=%2Fazure%2Fcost-management-billing%2Freservations%2Ftoc.json&WT.mc_id=AZ-MVP-5003856">instance size flexibility group</a> 或 <a href="https://learn.microsoft.com/azure/cost-management-billing/reservations/manage-reserved-vm-instance?WT.mc_id=AZ-MVP-5003856#change-optimize-setting-for-reserved-vm-instances">capacity priority</a> (單個 scope)。</li>
<li>一般來說 RI 會比 Saving Plans</li>
</ol>
<p>RI 最大的問題就在於彈性不是很大。RI 的概念是買某個機器規格,因此只能夠適用於某個機器規格(或者有限度的那個系列)</p>
<p>所以,有沒有可能可以給出一個像是 RI 但是又不會被機器規格綁死的東西?</p>
<h2 id="azure-savings-plans">什麼是 Azure Savings Plans</h2>
<p>這個服務算是相對新,在 2022 年的 10 月 GA</p>
<p>最主要的目的就是希望可以在 RI 以及一般的牌價(PAYG)中間取得一個平衡點</p>
<p>我們說 RI 的問題在於不夠彈性,這個正是 Savings Plans(SP) 想要解決的點</p>
<p>簡單來說,SP 買的是<mark>時數</mark>,而不是像 RI 買的是某個機器規格</p>
<p>所以,如果確定會用到某個時數(量),但是不一定是某個機器規格或者某個 region,那麼只要在提前購買的時數內,就可以得到優惠</p>
<p>這個時候,到底要買多少就變得很重要,下圖是官方介紹這個功能:</p>
<p><img src="/posts/2023/03/2023-03-07-faq-difference-between-azure-savings-plans-and-azure-reserved-instances/image-20230308063507-6ejjae0.png" class="img-responsive img-fluid" alt="官方介紹圖" /></p>
<figure class="figure">
<figcaption class="figure-caption">官方介紹圖 - <a href="https://azure.microsoft.com/en-us/pricing/offers/savings-plan-compute/?WT.mc_id=AZ-MVP-5003856#benefits-and-features">來源</a></figcaption>
<p>如果今天要購買,很容易只需要查 <code>Savings Plans</code> 就可以看到:</p>
<p><img src="/posts/2023/03/2023-03-07-faq-difference-between-azure-savings-plans-and-azure-reserved-instances/image-20230308061554-dxbyfv4.png" class="img-responsive img-fluid" alt="購買 Savings Plans 的畫面" title="購買 Savings Plans 的畫面" /></p>
<figcaption class="figure-caption">購買 Savings Plans 的畫面</figcaption>
</figure>
<h2 id="ri-sp">當 RI 和 SP 都有的時候,套用的順序是:</h2>
<ol>
<li>RI 的優先度會比 SP 高</li>
<li>如果有多個 SP 就會是最便宜的被套用</li>
</ol>
<h2 id="section">費用比較</h2>
<p>下圖是從:<a href="https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/quick-reference-understanding-azure-reservations-vs-savings/ba-p/3689070?WT.mc_id=AZ-MVP-5003856">Quick Reference: Understanding Azure Reservations vs Savings Plans</a> 截圖出來的比較表,裡面的金額不一定和現在一樣,不過這個只是給大家看出這個比較。</p>
<p><img src="/posts/2023/03/2023-03-07-faq-difference-between-azure-savings-plans-and-azure-reserved-instances/image-20230308061912-p3m6oo6.png" class="img-responsive img-fluid" alt="PAYG、SP、RI 的費用比較" title="PAYG、SP、RI 的費用比較" /></p>
<figure class="figure">
<figcaption class="figure-caption">PAYG、SP、RI 的費用比較</figcaption>
<p>如果在計算的時候需要確認金額,記得要選對選項:</p>
<p><img src="/posts/2023/03/2023-03-07-faq-difference-between-azure-savings-plans-and-azure-reserved-instances/image-20230308062104-x2f5vc4.png" class="img-responsive img-fluid" alt="Azure Pricing Calculator 的費用" title="Azure Pricing Calculator 的費用" /></p>
<figcaption class="figure-caption">Azure Pricing Calculator 的費用</figcaption>
</figure>
<h2 id="section-1">結語</h2>
<p>在彈性和費用之間取得一個平衡是使用雲服務的一個很重要一件事</p>
<p>希望透過這篇,大家對於 Savings Plan 和 Reserved Instance 的差異有所了解,並且可以省到錢</p>
<h2 id="section-2">參考資料</h2>
<ol>
<li><a href="https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/quick-reference-understanding-azure-reservations-vs-savings/ba-p/3689070?WT.mc_id=AZ-MVP-5003856">Quick Reference: Understanding Azure Reservations vs Savings Plans</a></li>
<li><a href="https://learn.microsoft.com/azure/cost-management-billing/savings-plan/savings-plan-compute-overview?WT.mc_id=AZ-MVP-5003856">What is Azure savings plans for compute?</a></li>
</ol>
<p><img src="/posts/2023/03/2023-03-07-faq-difference-between-azure-savings-plans-and-azure-reserved-instances/cover.jpg" class="img-responsive img-fluid" alt="圖片來源:https://pixabay.com/en/despair-alone-being-alone-archetype-513528/" /></p>
<figure class="figure">
<figcaption class="figure-caption">圖片來源:https://pixabay.com/en/despair-alone-being-alone-archetype-513528/</figcaption>
<p>要導入任何服務或者軟體之前,評估它的成本 (費用) 以及效益是說服老闆的最關鍵的一件事。</p>
<p>以 Azure 來說,以前有所謂的 Azure Reservation (Reserved Instance) 可以省到 62% 之多,所以如果有穩定使用的機器規格,不開 Reserved Instance 說不過去。</p>
<p>既然有了它,怎麼還會有另外一個所謂 Savings Plan 呢?</p>
<p>這篇來簡單的探討一下兩個的不同之處,以及什麼時候適合用什麼</p>
https://blog.alantsai.net/posts/2023/03/az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock
00-a 用 Azure Portal 管理資源 | AZ-104 課程 Lab 操作
2023-03-06T19:00:00Z
<p>這個系列是 AZ 104 的線上課程裡面所規劃的 Lab 用圖文方式呈現出要如何完成</p>
<p>這個 Lab 的主要目的是讓學生熟悉如何使用 Azure Portal 去做資源管理</p>
<p>在這個 Lab 裡面總共有 3 個任務:</p>
<ol>
<li>任務 1:建立Resource Group並將資源部署到Resource Group</li>
<li>任務 2:在Resource Group之間移動資源</li>
<li>任務 3:實現和測試資源鎖</li>
</ol>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20220406133746-1096gel.png" class="img-responsive img-fluid" alt="image.png" title="https://microsoftlearning.github.io/AZ-104-MicrosoftAzureAdministrator/Instructions/Labs/LAB_03a-Manage_Azure_Resources_by_Using_the_Azure_Portal.html" /></p>
<!--more-->
<h2 id="resource-groupresource-group">任務 1:建立Resource Group並將資源部署到Resource Group</h2>
<ol>
<li><p>登錄到 <a href="https://portal.azure.com">Azure Portal</a></p>
</li>
<li><p>在 Azure Portal中,搜索並選擇 **Disks,**並且按下 <kbd>Create</kbd> 的選項</p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318222208-m9dytmg.png" class="img-responsive img-fluid" alt="image" title="找到 Disks 並且選擇 Create" /></p>
</li>
<li><p>設定 Resource group 以及 Disk name</p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318222344-llzlji4.png" class="img-responsive img-fluid" alt="image" title="設定 Resource group 以及 Disk name" /></p>
</li>
<li><p>調整 Disk 規格 <strong>Standard HDD</strong> 和 <strong>32 GiB</strong></p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318222547-kquti24.png" class="img-responsive img-fluid" alt="image" title="在 Disk 選擇 Change Size" /></p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318222518-n63htcs.png" class="img-responsive img-fluid" alt="image" title="調整 Disk 規格 Standard HDD 和 32 GiB" /></p>
</li>
<li><p>單擊 <strong>Review + Create</strong>,然後單擊 <strong>Create</strong>。</p>
<blockquote class="blockquote">
<p><strong>備注</strong>: 等待磁盤建立完成。所需時間應該不超過一分鐘。</p>
</blockquote>
</li>
</ol>
<h2 id="resource-group">任務 2:在Resource Group之間移動資源</h2>
<p>把上個任務移動到新的 Resource Group</p>
<ol>
<li><p>進入 Resource Group</p>
</li>
<li><p>找到 <code>az104-00a-rg1</code> 這個 Resource Group<br />
<img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318222955-rgpao8j.png" class="img-responsive img-fluid" alt="image" title="找到 `az104-00a-rg1` 這個 Resource Group" /></p>
</li>
<li><p>進入 Resource Group 並且勾選要移動的資源</p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318223143-det57dp.png" class="img-responsive img-fluid" alt="image" title="進入 Resource Group 並且勾選要移動的資源" /></p>
</li>
<li><p>在移動的畫面,選擇建立新的 <code>az104-00a-rg2</code> 的 Resource Group</p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318223314-q0mp3e0.png" class="img-responsive img-fluid" alt="image" title="在移動的畫面,選擇建立新的 `az104-00a-rg2` 的 Resource Group" /></p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318223622-blnuml0.png" class="img-responsive img-fluid" alt="image" title="檢查通過可以按下 Next" /></p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318223651-1zqhcu6.png" class="img-responsive img-fluid" alt="image" title="勾選理解會產生出新的 resource id 然後按下 Move" /></p>
</li>
</ol>
<h2 id="section">任務 3:實現和測試資源鎖</h2>
<p>1~4 步重複任務 1 的內容,不過這次建立的:</p>
<ol>
<li>Resource Group = az104-00a-rg3</li>
<li>Disk name = az104-00a-disk2</li>
</ol>
<p>5~6 步接下來是要加入 Resource Lock</p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318224238-7hhqilj.png" class="img-responsive img-fluid" alt="image" title="在 resource group 找到 Locks 然後建立出一個 delete lock" /></p>
<p>7~9 步接下來是要驗證鎖有效果</p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318224422-llxj4ch.png" class="img-responsive img-fluid" alt="image" title="嘗試刪除 Resource Group" /></p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318224444-2bxc3lz.png" class="img-responsive img-fluid" alt="image" title="跳出訊息 - 刪不掉因為有鎖" /></p>
<p>10~11 步是嘗試調整 Disk 規格</p>
<p>由於我們不是用 Read-Only Lock,所以預期是可以被異動</p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318224612-i9r6jcr.png" class="img-responsive img-fluid" alt="image" title="嘗試調整 Disk 的規格" /></p>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20230318224637-bv0ison.png" class="img-responsive img-fluid" alt="image" title="異動成功" /> </p>
<p></p>
<p>這個系列是 AZ 104 的線上課程裡面所規劃的 Lab 用圖文方式呈現出要如何完成</p>
<p>這個 Lab 的主要目的是讓學生熟悉如何使用 Azure Portal 去做資源管理</p>
<p>在這個 Lab 裡面總共有 3 個任務:</p>
<ol>
<li>任務 1:建立Resource Group並將資源部署到Resource Group</li>
<li>任務 2:在Resource Group之間移動資源</li>
<li>任務 3:實現和測試資源鎖</li>
</ol>
<p><img src="/posts/2023/03/2023-03-06-az104-lab-familiar-azure-portal-by-create-resource-group-move-resource-resource-lock/image-20220406133746-1096gel.png" class="img-responsive img-fluid" alt="image.png" title="https://microsoftlearning.github.io/AZ-104-MicrosoftAzureAdministrator/Instructions/Labs/LAB_03a-Manage_Azure_Resources_by_Using_the_Azure_Portal.html" /></p>
https://blog.alantsai.net/posts/2023/02/review-event-azure-openai-seminar-iphone-moment-for-ai
微軟 Azure OpenAI Service Partner Workshop 筆記 - AI 時代的 iPhone 時刻 | 活動
2023-02-24T19:00:00Z
<p><img src="/posts/2023/02/2023-02-24-review-event-azure-openai-seminar-iphone-moment-for-ai/image-20230301183104-g1lw94j.png" class="img-responsive img-fluid" alt="快開始的時候的人數。有些卡在樓下的電梯,所以實際上最後是幾乎全部坐滿" title="快開始的時候的人數。有些卡在樓下的電梯,所以實際上最後是幾乎全部坐滿" /></p>
<figure class="figure">
<figcaption class="figure-caption">快開始的時候的人數。有些卡在樓下的電梯,所以實際上最後是幾乎全部坐滿</figcaption>
<p>微軟最近有場面對所有 Partner 的研討會,是關於目前最夯的在 Azure 上面的 OpenAI 服務(目前最火紅就是 ChatGPT 啦)。聽說一開放報名不到半天整個就爆滿,由此也可以看出這個議題有多熱</p>
<p>這次是有對 Microsoft MVP 保留名額,我就藉著這個機會報名並且參加了久違的線下研討會</p>
<p>這篇主要是把當天內容記錄一下,由於主辦單位目前還沒有釋放出投影片,所以怕踩到著作權問題就沒有把拍到的投影片放出來,我盡量用文字描述每一個我認為重要的點<br />
(這裡面有些內容不是研討會有談,有些是我自己的想法)</p>
<p>廢話不多說,來一起看看 NVIDIA 執行長黃仁勳說的:「AI的iPhone時刻來臨」指的是什麼</p>
<!--more-->
<h2 id="section">活動資訊</h2>
<p>這次活動的時間不長,大約是 14:00 ~ 16:30,主題大概可以區分為兩塊:</p>
<ol>
<li>微軟介紹</li>
<li>Partner 分享</li>
</ol>
<p><img src="/posts/2023/02/2023-02-24-review-event-azure-openai-seminar-iphone-moment-for-ai/image-20230302064932-f8as2j6.png" class="img-responsive img-fluid" alt="活動議程 1" title="活動議程 1" /></p>
<figcaption class="figure-caption">活動議程 1</figcaption>
</figure>
<p><img src="/posts/2023/02/2023-02-24-review-event-azure-openai-seminar-iphone-moment-for-ai/image-20230302065008-9lm0pdy.png" class="img-responsive img-fluid" alt="活動議程 2" title="活動議程 2" /></p>
<figure class="figure">
<figcaption class="figure-caption">活動議程 2</figcaption>
<p>下面,我就針對我認為重要的地方和大家介紹一下,到底聽到了什麼。</p>
<h2 id="aiiphone">AI的iPhone時刻來臨</h2>
<p>我們都知道(如果你夠老的話 XD),在 2007 年 iPhone 問世之前就已經有所謂的<mark>智慧型裝置</mark>。那時候還叫做 PDA (personal digital assistance)。我還記得那個時候微軟還有出所謂的 Compact Framework 目的就是讓開發 PDA 的應用程式很容易。</p>
<p>在當時,雖然大家都知道 PDA 是一個未來的趨勢,不過不知道為什麼一直火熱不起來。是,有一小撮的人有在使用,甚至當初我也想要買一個來玩看看開發(還好沒有 XD),但是直到了 iPhone 在 2007 年的問世,直接打破了 PDA 並且迅速的成為了主流。</p>
<p>回到我們的現況,在近幾年因為雲和大數據的普及,AI 也開始變成了一門顯學。從一開始需要懂的比較多,到後面很多可以自動化的角度去建立模型,使用 AI 的成本越來越低了,雖然一直會聽到可以用 AI 來增加生產率,但是一直<mark>沒有一個爆點</mark>,直到了現在。</p>
<p>台灣微軟總經理 Sean 也用真實案例反映了這件事。</p>
<p>依照之前的經驗,當微軟有個什麼 Solution 想要推出的時候,都是需要去和 Partner 或者客戶<mark>主動聯繫</mark>看是不是需要做 PoC 或者幫評估帶來的效益是什麼。</p>
<p>但是,Azure 的 OpenAI 服務完全是顛倒過來,是 Partner 或者客戶<mark>主動來詢問</mark>想用這個東西,可以怎麼用。</p>
<p>Azure OpenAI 的服務在 2月 GA,不過是需要申請才可以使用:</p>
<ol>
<li>全球已經有 10K 以上的客戶有申請要使用</li>
<li>台灣有 50 家以上的客戶有申請要使用</li>
</ol>
<p>這個量是微軟以前其他 Azure 服務看不到的申請量體</p>
<p>這次研討會的邀請,不到半天就爆滿也無形中的側面了反映這件事</p>
<p>這個告訴我們:</p>
<blockquote class="blockquote">
<p>AI的iPhone時刻來臨</p>
<p>--NVIDIA 執行長黃仁勳</p>
</blockquote>
<p></p>
<h2 id="openaiazure-openai-gptchatgpt">OpenAI、Azure OpenAI 服務、GPT、ChatGPT、傻傻分不清楚</h2>
<p>先簡單說明一下幾個可能容易搞混的資訊:</p>
<dl>
<dt>OpenAI </dt>
<dd>OpenAI 是一家專門研究 AI 的組織。微軟有提供很多底層服務給這家組織使用。GPT 是其中一個訓練出來的 AI 模型。除了 GPT 之外還有很多其他模型</dd>
<dt>Azure OpenAI </dt>
<dd>由微軟提供跑在在 Azure 上面由 OpenAI 訓練出來的模型變成一個<mark>企業等級</mark>的服務。也是目前市面上唯一提供企業等級的 OpenAI 服務</dd>
<dt>GPT </dt>
<dd>由 OpenAI 訓練出來的 NLG (Natural Language Generation) 的 AI 模型。目前最新版本是 GPT 3.5</dd>
<dt>ChatGPT </dt>
<dd>透過 Conversational AI(或者俗稱的 chat、聊天機器人)的界面整合 GPT 3.5 模型來回答人們的問題。所以他是一個用 GPT 3.5 的 solution</dd>
</dl>
<p>微軟提供的 OpenAI 服務和 OpenAI 這家公司提供的服務雖然底層都是用一樣的模型,但是差別在於微軟是<mark>企業等級的服務</mark>,而 OpenAI 也有提供服務,不過他們是以偏<mark>學術研究</mark>性質的服務。</p>
<p>意思是,微軟的 Azure OpenAI:</p>
<ol>
<li>高資安規格 - OpenAI 不太可能和 Cognitive Service 一樣提供 Container 可以在地端跑的版本。但是可以透過整合 Virtual Network Private Endpoint 來達到走私有通道</li>
<li>高可用 - 由微軟的 Azure 作為底層,提供 99.9% SLA 等級的服務</li>
<li>微軟保證不會使用客戶的資料
<ol>
<li>資料隱私權規範和整個 Azure 對客戶資料的使用保證是一樣</li>
<li>如果有微調模型 - 例如 Fine Tune 的資料不會被拿去</li>
<li>微軟很在乎所謂的 Responsible AI,因此有人工審核流程確保模型不會被訓練壞掉
<ol>
<li>如果不想要有人工審核,可以單獨申請關閉</li>
</ol>
</li>
</ol>
</li>
</ol>
<p>其他幾個和 GPT 有關的資訊</p>
<ul>
<li>GPT 是由 1700 億個參數 (parameters) 訓練出來的模型</li>
<li>目前訓練的內容涵蓋 2021/06</li>
<li>大約是 9 歲小孩的智商</li>
</ul>
<p>OpenAI 訓練了什麼類型的模型:</p>
<ol>
<li>GPT - 文字 NLG 類型的模型</li>
<li>Codex - 程式碼產生類型的模型</li>
<li>DALL·E - 圖像產生類型的模型</li>
</ol>
<h2 id="gpt-ai-iphone">GPT 為什麼是 AI 界的 iPhone 時刻 - 可以和什麼整合</h2>
<p>微軟本來就有所謂的 Cognitive Service(<a href="/tags/cognitive-service">之前有個系列在介紹這些服務</a>),和 GPT 最大的不同在於,之前這些服務都是偏識別或者理解(Understanding)裡面的內容</p>
<p>理解內容之後,程式可以在<mark>依照設定好</mark>的內容來決定<mark>應該發生什麼事</mark></p>
<p>這代表,需要時常更新才有辦法回應最新的內容</p>
<p>GPT 的差別是重點在產生(Generate),所以搭配起來就可以有很多應用</p>
<ol>
<li>Speech to text 服務把語音轉成文字之後,透過 GPT 把會議總結、後續 Action 整理出來</li>
<li>Form Recognizer OCR 發票,透過 GPT 把發票性質整理出來</li>
</ol>
<p>現在有很多這種真實應用的例子:</p>
<ol>
<li>虛擬主播 - 透過 GPT 把重點總結,然後文字轉語音讓虛擬主播報出來</li>
<li>遊戲世界 - 可以因為玩家的行為,<mark>動態</mark>由 GPT 生成對應內容,讓 NPC 文字不再是一成不變</li>
<li>把 Low code 變成 no code - 用文字方式描述要達到的效果,由模型自動產生出 Excel 的函數</li>
</ol>
<p></p>
<h2 id="gpt">GPT 的主要概念</h2>
<h4 id="section-1">幾個術語</h4>
<dl>
<dt>Prompt 提示 </dt>
<dd>可以理解成為 input 到 model 的內容。主要為模型 (引擎) 提供上下文。如果提供的不夠明確,會容易導致無法給出有用的回應</dd>
<dt>Completion 完成回應 </dt>
<dd>可以理解成為 model 的 output 內容</dd>
<dt>Tokens 組成文字的最小積木 </dt>
<dd>
<p>會把文字先轉換成為 Token 之後作為運算內容</p>
<ol>
<li>1 token ~= 4 英文字符。1 token ~= 3/4 單詞</li>
<li>100 token ~= 75 單詞</li>
<li>1 ~ 2 句子 ~= 30 token</li>
<li>1 文段 ~= 100 token</li>
</ol>
</dd>
<dt>Fine-tuning </dt>
<dd>把模型在訓練的意思。讓模型更適合某個情境或者領域 (domain)。reinforcement learning 的概念</dd>
<dt>Prompt Design </dt>
<dd>在 Fine tuning 的過程中依照情境或者領域來設計 prompt 讓模型更貼近應用</dd>
<dt>Prompt Engineering </dt>
<dd>怎麼下對的 prompt 讓 GPT 可以回覆出有幫助的內容</dd>
</dl>
<h4 id="section-2">模型類型以及挑選方式</h4>
<p>GPT 總共有 4 個模型版本:</p>
<ol>
<li>Ada</li>
<li>Babbage</li>
<li>Curie</li>
<li>Davinci</li>
</ol>
<p>以上從上到下代表的是從最小、最便宜到最大、最貴的順序</p>
<p><mark>模型並不是越新或者越大就越好</mark></p>
<p>怎麼挑選模型:</p>
<ol>
<li>如果有大量優質的數據,建議低複雜度的模型(因為可以 fine tuning)</li>
<li>如果是分類/歸納這類相對簡單認為,建議 A 類型</li>
</ol>
<p>Fine Tuning 的部分:</p>
<ol>
<li>可以先從 Davinci 開始作為一個 baseline</li>
<li>透過 fine tuning 其他 3 個模型版本,然後用 baseline 作為驗證讓費用越來越便宜</li>
</ol>
<h2 id="azure-openai">Azure OpenAI 相關注意事項</h2>
<ol>
<li>費用計算方式:<br />
<code>(月活躍用戶數 MAU * 用戶平均耗字數 * Token 倍率) + 每月 Fine-Tune 時長 + 模型 hosting 時長</code><br />
(和 OpenAI 的計算方式不同。Token 倍率英文可以抓 1.33 不過中文就要去試看看)</li>
<li>和 OpenAI 的 Model 版本是否會同步<br />
會跟大版號。<br />
目前有兩周的落差,不過未來期望不會有落差。</li>
<li>Fine Tuning 很吃情境和 case,所以沒有什麼特別的 Best practise</li>
<li>服務產生出來的版權是屬於誰的?<br />
和 Word Excel 一樣,Azure OpenAI 只是工具,產生出來的版權屬於製造者</li>
</ol>
<p></p>
<h2 id="section-3">怎麼開始</h2>
<ol>
<li>微軟的 Azure OpenAI 目前雖然 GA,但是要申請通過之後才能夠使用,所以可能有需要等的時間,因此建議可以先從 <a href="https://openai.com/blog/openai-api">OpenAI </a>開始</li>
<li>Azure OpenAI 提供的 API 規格和 OpenAI 會是一樣的,因此可以先從 OpenAI 作為學習的入門點,然後熟悉之後,要做 solution 的時候,在<a href="https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR7en2Ais5pxKtso_Pz4b1_xUOFA5Qk1UWDRBMjg0WFhPMkIzTzhKQ1dWNyQlQCN0PWcu">申請 Azure OpenAI</a></li>
</ol>
<h2 id="section-4">微軟相關應用分享</h2>
<ol>
<li><a href="https://www.microsoft.com/en-us/microsoft-teams/premium">Teams premium</a> 預計是 4 月才有更詳細消息 - 能夠把會議整合出來重點 summary、action、跳到重點片段</li>
<li>整合 Power Apps 讓 Low code 變成 no code - 自然語言產生出需要用什麼函數</li>
<li>整合 Power Automate 把行為自動化或者 RPA 達到生產力提供</li>
</ol>
<h2 id="partner">Partner 的部分</h2>
<h3 id="deep-insight">Deep Insight - 個人化行銷的應用</h3>
<p>傳統來說是透過人工的角度去把消費者分群,並且想辦法發出針對性的廣告行銷來促成消費者來購買。能夠分 3~4 群就很了不起,但是如果真的要做到個人化,這個其實還有很多可以加強的部分。所以傳統來說可以增加人力來達成。</p>
<p>但是,如果今天想要不增加行銷或者相關人員就可以快速產生出相關行銷內容怎麼辦?</p>
<p>更甚至,如果我可以針對每一個客戶都發出對應的個人化行銷那麼是否更容易提供轉換率?</p>
<p>Deep Insight 就是透過 GPT 整合演算法來達到個人化行銷</p>
<h3 id="section-5">碩網</h3>
<p>主要在整合應用:</p>
<ol>
<li>代替訓練的資料換句話說 - 譬如說換語氣,或者換表達方式</li>
<li>沒有答案的時候,給一個 general 但是又不是那麼 general 的答案</li>
<li>提供答案的建議 - 類似於 QnA Maker 的概念</li>
<li>改善答案的口語程度</li>
<li>多語係的應用,翻譯文字 - 類似於 Speech Translate</li>
<li>用問句產生報表 - 用自然語言就可以產生出要的效果</li>
</ol>
<h3 id="aiello">Aiello - 透過語音的方式來提供更好的服務</h3>
<p>兩個產品:</p>
<ol>
<li>AVA - 大部分使用在 Hotel。當 call 客房服務的時候,可以因為內容以及環境的情境分析,提供更好的服務給客人。</li>
<li>Vocol - 還沒上市,主要是把語音的內容整合在一起在一個平台能夠了解整個電話的過程達到變成一個集中以及整合的平台。所以會錄音、整理內容變成會議記錄、變成 todo,可以 keyword 查詢,可以從文字對應到那個語音的片段</li>
</ol>
<p></p>
</figure>
<p><img src="/posts/2023/02/2023-02-24-review-event-azure-openai-seminar-iphone-moment-for-ai/image-20230301183104-g1lw94j.png" class="img-responsive img-fluid" alt="快開始的時候的人數。有些卡在樓下的電梯,所以實際上最後是幾乎全部坐滿" title="快開始的時候的人數。有些卡在樓下的電梯,所以實際上最後是幾乎全部坐滿" /></p>
<figure class="figure">
<figcaption class="figure-caption">快開始的時候的人數。有些卡在樓下的電梯,所以實際上最後是幾乎全部坐滿</figcaption>
<p>微軟最近有場面對所有 Partner 的研討會,是關於目前最夯的在 Azure 上面的 OpenAI 服務(目前最火紅就是 ChatGPT 啦)。聽說一開放報名不到半天整個就爆滿,由此也可以看出這個議題有多熱</p>
<p>這次是有對 Microsoft MVP 保留名額,我就藉著這個機會報名並且參加了久違的線下研討會</p>
<p>這篇主要是把當天內容記錄一下,由於主辦單位目前還沒有釋放出投影片,所以怕踩到著作權問題就沒有把拍到的投影片放出來,我盡量用文字描述每一個我認為重要的點<br />
(這裡面有些內容不是研討會有談,有些是我自己的想法)</p>
<p>廢話不多說,來一起看看 NVIDIA 執行長黃仁勳說的:「AI的iPhone時刻來臨」指的是什麼</p>
https://blog.alantsai.net/posts/2023/02/understand-azure-reliability-and-availability-lesson-learned-from-azure-Incident
如何避免 Azure 服務中斷 - 從 2月的當機事件來看看基本的高可用概念
2023-02-16T19:00:00Z
<p>在今年的 02/07 到 02/09 號之間,在 Southeast Asia 和 East Asia 這兩個 region 的服務都有受到影響,甚至導致資源無法存取</p>
<p>剛好藉著這個事件,我們這篇來探討一下在 Azure 裡面最基本的高可用(High Availability)概念,也就是 Regional、Availability Zone 和 Availability Set</p>
<p>取決於應用的等級,應該用什麼等級的高可用,這篇我們來看一下</p>
<h2 id="tldr">TL;DR;</h2>
<table class="table">
<thead>
<tr>
<th>功能</th>
<th>Azure Region</th>
<th>Availability Zone</th>
<th>Availability Set</th>
</tr>
</thead>
<tbody>
<tr>
<td>定義</td>
<td>包含一個或多個資料中心的地理區域</td>
<td>擁有獨立電力和網路的單一資料中心</td>
<td>在資料中心內的虛擬機器的邏輯分組</td>
</tr>
<tr>
<td>目的</td>
<td>- 能夠部署應用在更靠近使用者的地方<br />- 提供高可用</td>
<td>提供更高的高可用</td>
<td>提供高可用</td>
</tr>
<tr>
<td>SLA</td>
<td>保證 99.99% 的運行時間</td>
<td>每個 Zone 保證 99.99% 的運行時間</td>
<td>每個 Set 保證99.95% 的運行時間</td>
</tr>
<tr>
<td>隔離</td>
<td>與其他 Region 隔離,擁有獨立資源</td>
<td>與其他 Zone 隔離,擁有獨立資源</td>
<td>多台 VM 橫跨在多個 Fault Domain</td>
</tr>
<tr>
<td>費用</td>
<td>價格因 Region 而異</td>
<td>除 VM 和儲存空間外,無額外費用</td>
<td>除 VM 和儲存空間外,無額外費用</td>
</tr>
<tr>
<td>VN11-JD8 事件的影響</td>
<td>East Asia Region 的部分服務受到影響</td>
<td>如果有部署到 2 個或以上 Zone 的服務受到服務影響</td>
<td>部署到有影響的 Datacenter 應用因此受到服務中斷</td>
</tr>
</tbody>
</table>
<!--more-->
<h2 id="idvn11-jd8">發生了什麼事?追蹤 Id:VN11-JD8</h2>
<p>完整的事件報告可以在這邊看到:<a href="https://azure.status.microsoft/en-us/status/history?WT.mc_id=AZ-MVP-5003856">Azure status history</a></p>
<p>整個事件的時間:2023/02/07 20:19 ~ 2023/03/09 04:30</p>
<p>簡單來說,就是在 Southeast Asia 的 Region 其中一個 Availability Zone 發生了冷卻系統異常,導致了:</p>
<ol>
<li>整個 Datacenter 為了保護基礎建設和資料因此整個關閉</li>
</ol>
<p>並且有兩個<mark>沒有預期</mark>的錯誤也發生了:</p>
<ol>
<li>有些跨 region 的服務因此受到影響(degradation)</li>
<li>有些設計在出錯的時候 failover 到跨 zone 或者跨 region 的服務沒有運作正常</li>
</ol>
<p>那些服務受到那些影響,以及完整的過程可以參考上面提供的連結,這邊以這個事件為例目的只是讓大家知道,機器總是有可能壞掉,所以規劃好高可用的策略很重要</p>
<h2 id="high-availability">基本的高可用 (High Availability) 概念</h2>
<p>以 Azure 來說,我們可以簡單分為 3 個層級:</p>
<ol>
<li>Regional</li>
<li>Availability Zone</li>
<li>Availability Set</li>
</ol>
<p>這三個層級,在 Azure 的不同服務有不同的設定方式可以達到,這篇將會以 Azure Virtual Machine (VM) 作為範例</p>
<h3 id="regional">Regional</h3>
<p>當我們建立任何的 Azure 資源的時候,第一個碰到的選擇都會是建立在哪裡,而這個哪裡就是 Regional</p>
<p>離我們亞洲最近的就是 East Asia(香港)以及 Southeast Asia(新加坡)</p>
<p>以我們這次的案例,就是發生在 Southeast Asia 這個 Region</p>
<p><img src="/posts/2023/02/2023-02-16-understand-azure-reliability-and-availability-lesson-learned-from-azure-Incident/image-20230312172512-a3j5wlv.png" class="img-responsive img-fluid" alt="在 Azure Portal 建立 VM 的畫面" title="在 Azure Portal 建立 VM 的畫面" /></p>
<figure class="figure">
<figcaption class="figure-caption">在 Azure Portal 建立 VM 的畫面</figcaption>
<p>如果是 Regional 等級的高可用,同等於在 2 個或以上的 Region 裡面要建立出一樣的 VM 然後在透過像是 <a href="https://learn.microsoft.com/azure/traffic-manager/traffic-manager-overview?WT.mc_id=AZ-MVP-5003856" class="img-responsive">Azure Traffic Manager</a> 或者 <a href="https://learn.microsoft.com/azure/frontdoor/front-door-overview?WT.mc_id=AZ-MVP-5003856" class="img-responsive">Azure Front Door</a> 來把流量導向正確的地方</p>
<p>這邊有很多資訊簡化掉了,如果想要結費,還可以在區分出到底是建立 Active-Active 還是 Active-StandBy 等模式</p>
<p>以這次案例來說,如果有做到 Regional 的高可用,那麼可以避免受到這次事件導致服務中斷</p>
<p>Secondary Region 的概念沒有提到,所以這次為例雖然發生的問題在 Southeast Asia,但是 East Asia 也受到了影響</p>
<h3 id="availability-zone">Availability Zone</h3>
<p>不是所有的 Region 都有支援 Availability Zone,如果有,就至少會有 3 個 Zone</p>
<p>1 個 Zone 裡面就有 <mark>1 個或者多個 Datacenter</mark></p>
<p>Datacenter 之間的水、電是分離</p>
<p><img src="/posts/2023/02/2023-02-16-understand-azure-reliability-and-availability-lesson-learned-from-azure-Incident/image-20230312173737-m714i4p.png" class="img-responsive img-fluid" alt="官方介紹 Availability Zone" title="官方介紹 Availability Zone" /></p>
<figcaption class="figure-caption">官方介紹 Availability Zone</figcaption>
</figure>
<p>Azure 什麼服務有支援到 Zone,以及支援到什麼程度可以參考這個<a href="https://learn.microsoft.com/en-us/azure/reliability/availability-zones-service-support?WT.mc_id=AZ-MVP-5003856">連接</a></p>
<p>Azure VM 在建立的過程,如果想要設定,那麼就可以從 Zone 裡面去選擇</p>
<p><img src="/posts/2023/02/2023-02-16-understand-azure-reliability-and-availability-lesson-learned-from-azure-Incident/image-20230312174549-jxp36vj.png" class="img-responsive img-fluid" alt="Azure VM 建立 Zone 的截圖" title="Azure VM 建立 Zone 的截圖" /></p>
<figure class="figure">
<figcaption class="figure-caption">Azure VM 建立 Zone 的截圖</figcaption>
<p>如果有建立兩個或以上的 VM 在不同的 Zone,可以保證至少 1 個 VM 的連線可以在 99.99%</p>
<p>以這個事件來說,如果有部署在 Availability Zone 上,因為水電等是分開的,所以可以避免受到服務中斷</p>
<h3 id="availability-set">Availability Set</h3>
<p>由於機器有可能會有物理上的<mark>非預期損壞導</mark>致服務中斷,以及<mark>有預期的更新</mark>導致服務中斷,為了解決這兩種情況有所謂的 Availability Set</p>
<p>Availability Set 就是 Datacenter 裡面的機櫃,每一組的 Availability Set 就可以確保部署的機器放在<mark>不同的機櫃</mark>上面</p>
<p>透過這個方式,可以確保例如在做有預期更新的時候,可以分開做,導致不會兩台機器一起被關機</p>
<p>Availability Set 的兩個 domain 就是為了代表不同的意圖把 VM 放到不同的機櫃上面:</p>
<ol>
<li>Fault Domain - 非預期損壞的一群</li>
<li>Update domain - 有預期更新的一群</li>
</ol>
<p>以 Azure VM 的 SLA 來說,2 台或以上的 VM 部署在<mark>同一個</mark> Availability Set 可以達到 99.95% 的 SLA</p>
<p><img src="/posts/2023/02/2023-02-16-understand-azure-reliability-and-availability-lesson-learned-from-azure-Incident/image-20230312180245-jggeq9p.png" class="img-responsive img-fluid" alt="Azure VM 的 Availability Set" title="Azure VM 的 Availability Set" /></p>
<figcaption class="figure-caption">Azure VM 的 Availability Set</figcaption>
</figure>
<p></p>
<p>在今年的 02/07 到 02/09 號之間,在 Southeast Asia 和 East Asia 這兩個 region 的服務都有受到影響,甚至導致資源無法存取</p>
<p>剛好藉著這個事件,我們這篇來探討一下在 Azure 裡面最基本的高可用(High Availability)概念,也就是 Regional、Availability Zone 和 Availability Set</p>
<p>取決於應用的等級,應該用什麼等級的高可用,這篇我們來看一下</p>
<h2 id="tldr">TL;DR;</h2>
<table class="table">
<thead>
<tr>
<th>功能</th>
<th>Azure Region</th>
<th>Availability Zone</th>
<th>Availability Set</th>
</tr>
</thead>
<tbody>
<tr>
<td>定義</td>
<td>包含一個或多個資料中心的地理區域</td>
<td>擁有獨立電力和網路的單一資料中心</td>
<td>在資料中心內的虛擬機器的邏輯分組</td>
</tr>
<tr>
<td>目的</td>
<td>- 能夠部署應用在更靠近使用者的地方<br />- 提供高可用</td>
<td>提供更高的高可用</td>
<td>提供高可用</td>
</tr>
<tr>
<td>SLA</td>
<td>保證 99.99% 的運行時間</td>
<td>每個 Zone 保證 99.99% 的運行時間</td>
<td>每個 Set 保證99.95% 的運行時間</td>
</tr>
<tr>
<td>隔離</td>
<td>與其他 Region 隔離,擁有獨立資源</td>
<td>與其他 Zone 隔離,擁有獨立資源</td>
<td>多台 VM 橫跨在多個 Fault Domain</td>
</tr>
<tr>
<td>費用</td>
<td>價格因 Region 而異</td>
<td>除 VM 和儲存空間外,無額外費用</td>
<td>除 VM 和儲存空間外,無額外費用</td>
</tr>
<tr>
<td>VN11-JD8 事件的影響</td>
<td>East Asia Region 的部分服務受到影響</td>
<td>如果有部署到 2 個或以上 Zone 的服務受到服務影響</td>
<td>部署到有影響的 Datacenter 應用因此受到服務中斷</td>
</tr>
</tbody>
</table>
https://blog.alantsai.net/posts/2023/02/how-to-create-azure-public-ip-and-associate-to-virtual-machinese
如何在 Azure Virtual Machines 加上 Public IP
2023-02-13T19:00:00Z
<p>在上一篇 <a href="/posts/2023/02/faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue">為什麼我的 Azure Windows Virtual Machine (虛擬機器) 連線不到?故障排除指南指南 | FAQ</a> 其中有提到,如果在建立過程把 Public IP 拿掉的話,那麼最後當然就不會建立出來,那麼就只透過內網的 Private IP 來連線</p>
<p>不過建立完之後,想要加載 Public IP Address 會怎麼做呢?</p>
<p>這篇我們來看一下</p>
<p><img src="/posts/2023/02/2023-02-13-how-to-create-azure-public-ip-and-associate-to-virtual-machinese/image-20230215061753-kj66eu9.png" class="img-responsive img-fluid" alt="image" title="建立 Azure VM 會詢問是否建立 Public IP。預設都是會建立" /></p>
<figure class="figure">
<figcaption class="figure-caption">建立 Azure VM 會詢問是否建立 Public IP。預設都是會建立</figcaption>
<!--more-->
<p>總共有兩段:</p>
<ol>
<li>建立 Public IP Address</li>
<li>關聯 Public IP Address</li>
</ol>
<h2 id="public-ip-address">建立 Public IP Address</h2>
<ol>
<li><p>先找到 Public IP Address 的 Service,然後按下 <kbd>Create</kbd><br />
相對簡單,只要透過搜索就可以找到<br />
<img src="/posts/2023/02/2023-02-13-how-to-create-azure-public-ip-and-associate-to-virtual-machinese/image-20230315055225-yqgzffb.png" class="img-responsive img-fluid" alt="image" title="建立 Public IP Address 對的截圖" /></p>
<figure class="figure">
<figcaption class="figure-caption">建立 Public IP Address 對的截圖</figcaption>
</figure>
</li>
<li><p>幾個比較重要的設定有</p>
<p><img src="/posts/2023/02/2023-02-13-how-to-create-azure-public-ip-and-associate-to-virtual-machinese/image-20230315055353-xv17dk6.png" class="img-responsive img-fluid" alt="image" title="建立 Public IP 的設定" /></p>
<figure class="figure">
<figcaption class="figure-caption">建立 Public IP 的設定</figcaption>
<ol>
<li><p><code>SKU</code> 、<code>Tier</code> - Public IP Address 可以被掛載在 Load Balancer,所以這邊的 SKU 要配對的上</p>
</li>
<li><p><code>IP address assignment</code> - IP 要屬於動態 (dynamic) 或者靜態 (static)。動態的意思是隨著資源啟動的時候才會指派 IP,靜態則是不管有沒有啟動都會有一個保留住。</p>
<p>這個會和費用有關係,動態相對便宜</p>
</li>
<li><p><code>DNS Name Label</code> - 這個設定截圖大小的關係剛好沒看到。不過假設這邊有設定就可以用 DNS 名稱方式來存取。所以從經濟實惠的角度來說,可以 <code>IP address assignment</code> 用動態,然後設定 DNS Name Lable 用 DNS 來存取</p>
</li>
</ol>
</figure>
</li>
</ol>
<h2 id="public-ip-address-1">關聯 Public IP Address</h2>
<p>找到剛剛建立出來的 Public IP Address,點進去之後:</p>
<ol>
<li><p>在 <code>Overview</code> 畫面的上面,選擇 <code>Associate</code> 來關聯這個 Public IP</p>
<p><img src="/posts/2023/02/2023-02-13-how-to-create-azure-public-ip-and-associate-to-virtual-machinese/image-20230315060956-hyy3qlj.png" class="img-responsive img-fluid" alt="image" title="Public IP 的 Associate 按鈕" /></p>
<figure class="figure">
<figcaption class="figure-caption">Public IP 的 Associate 按鈕</figcaption>
</figure>
</li>
<li><p>在右邊的 <code>Resource Type</code> 選擇要綁定的類型,然後在從下面對應的下拉選單找到想要綁定的資源。以 VM 為例,綁定到的就是 <code>Network Interface</code> 就是網卡的部分<br />
<img src="/posts/2023/02/2023-02-13-how-to-create-azure-public-ip-and-associate-to-virtual-machinese/image-20230315061114-taiqblo.png" class="img-responsive img-fluid" alt="image" title="綁定 Public IP 的畫面" /></p>
<figure class="figure">
<figcaption class="figure-caption">綁定 Public IP 的畫面</figcaption>
</figure>
</li>
</ol>
<p>綁定好了之後,我們在去看一下 VM 的 Overview 畫面</p>
<ol>
<li><code>Public IP address</code> 這邊目前顯示的是資源的名稱。這個是因為建立出來的是動態的 IP,所以只有 VM 跑起來才會有實際的 IP 值。如果今天是靜態的 IP,這邊會直接顯示靜態的 IP</li>
<li><code>DNS name</code> 假設在建立的時候有設定那個 DNS label,這邊就會顯示設定的值。</li>
</ol>
<p><img src="/posts/2023/02/2023-02-13-how-to-create-azure-public-ip-and-associate-to-virtual-machinese/image-20230315061558-twwo8z9.png" class="img-responsive img-fluid" alt="image" title="VM 的 Overview 畫面" /></p>
<p>假設上面的兩個要調整,直接點下去就會看到:</p>
<p><img src="/posts/2023/02/2023-02-13-how-to-create-azure-public-ip-and-associate-to-virtual-machinese/image-20230315061939-in4cuhf.png" class="img-responsive img-fluid" alt="image" title="可以設定 Public IP 的值" /></p>
<figcaption class="figure-caption">可以設定 Public IP 的值</figcaption>
</figure>
<h2 id="section">結語</h2>
<p>這篇我們看了一下如何獨立建立 Public IP Address,並且把它關聯到對應的資源上面</p>
<p>這個也可以看到,微軟在建立資源的時候整合建立的話幫我們把很多事情都一起做掉了,所以如果沒有真的一個一個建立組裝過的話,可能會不知道為什麼是如此</p>
<p>希望大家對於怎麼連到 VM 這個問題都一起解決了。</p>
<p>在上一篇 <a href="/posts/2023/02/faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue">為什麼我的 Azure Windows Virtual Machine (虛擬機器) 連線不到?故障排除指南指南 | FAQ</a> 其中有提到,如果在建立過程把 Public IP 拿掉的話,那麼最後當然就不會建立出來,那麼就只透過內網的 Private IP 來連線</p>
<p>不過建立完之後,想要加載 Public IP Address 會怎麼做呢?</p>
<p>這篇我們來看一下</p>
<p><img src="/posts/2023/02/2023-02-13-how-to-create-azure-public-ip-and-associate-to-virtual-machinese/image-20230215061753-kj66eu9.png" class="img-responsive img-fluid" alt="image" title="建立 Azure VM 會詢問是否建立 Public IP。預設都是會建立" /></p>
<figure class="figure">
<figcaption class="figure-caption">建立 Azure VM 會詢問是否建立 Public IP。預設都是會建立</figcaption>
https://blog.alantsai.net/posts/2023/02/faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue
為什麼我的 Azure Windows Virtual Machine (虛擬機器) 連線不到?故障排除指南指南 | FAQ
2023-02-11T19:00:00Z
<p>對於任何第一次上手任何雲端服務的時候,第一件事估計都是建立出 Virtual Machine (虛擬機器),算是雲端的 Hello World 吧。</p>
<p>這個時候,如果遇到無法連線(這邊的連線指的是透過 Remote Desktop Protocol)進去估計會很沮喪,導致撞墻不想繼續下去。</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-11-faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue/image-20230215063151-0cpnx3h.png" class="img-responsive img-fluid" alt="到底為什麼連不到" title="到底為什麼連不到" /></p>
<figcaption class="figure-caption">到底為什麼連不到</figcaption>
</figure>
<p>我這篇想要先介紹一下,如果遇到這件事,可以從什麼角度去嘗試排除問題。</p>
<p>這邊主要是會以 Azure 的 Windows VM,不過基本概念在任何雲端平台都是一樣的概念。</p>
<!--more-->
<h2 id="section">排除的步驟</h2>
<p>大概可以分幾個部分:</p>
<ol>
<li>確認一下建立的 VM 是否有賦予他對外連線的相關資源</li>
<li>確認一下是不是有因為防火墻導致阻擋了連線</li>
<li>確認一下是不是你的網路環境導致連線不進去</li>
<li>確認一下是不是因為忘記了帳號密碼所以導致連不進去</li>
</ol>
<h3 id="vm">確認一下建立的 VM 是否有賦予他對外連線的相關資源</h3>
<p>如果我們今天想要連到 VM,但是沒有給他讓我們可以定位的點,那麼肯定連線不進去。</p>
<p>這就像是,如果你想要去拜訪朋友,你總要有朋友的<mark>地址</mark>。</p>
<p>地址對應到地圖就會有精準的<mark>經緯度</mark>,這樣導航才可以正確的帶我們過去。</p>
<p>這兩個資訊,理論上我們只要有其中一個,就可以準確的到達目的地。</p>
<p>對應到資訊系統:</p>
<ol>
<li><p>地址 = Domain</p>
</li>
<li><p>經緯度 = IP</p>
<div class="bs-callout bs-callout-info"><p>準確一點說,IP 又有區分 Private IP 和 Public IP<br />
Private IP 代表要在同個網路才能夠識別(類似於雅房的概念,同一間屋子才能夠識別),基本上以下 3 個就是 Private IP:<br />
1.10.0.0.0/8<br />
2.172.16.0.0/12<br />
3.192.168.0.0/16<br />
Public IP 則是從外部網路可以識別(類似於有門牌的套房的概念)</p>
</div>
</li>
</ol>
<p>所以,第一件事就要先確認到底你的虛擬機器是否有這兩個資訊的其中一個?</p>
<p>我們可以從 Azure VM 的 Overview 來看到這件事:</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-11-faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue/image-20230215062259-ishnlzv.png" class="img-responsive img-fluid" alt="Azure VM 的 Overview 內容" title="Azure VM 的 Overview 內容" /></p>
<figcaption class="figure-caption">Azure VM 的 Overview 內容</figcaption>
</figure>
<p>從上圖的兩個地方:</p>
<ol>
<li><code>Public IP Address</code> - 這邊的地址就是我們指派給她的 Public IP</li>
<li><code>DNS Name</code> - 假設今天不想要建立 Public IP(雖然 IP 不算貴,但是想省錢的話),那麼透過設定 DNS Name 也可以達到能夠連線的地方</li>
</ol>
<p>我們點 <code>Connect</code> 的時候,也會問到底是用什麼方式連線來提供連線資訊:</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-11-faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue/image-20230215062802-kxpsux1.png" class="img-responsive img-fluid" alt="Connect 的不同選擇方式" title="Connect 的不同選擇方式" /></p>
<figcaption class="figure-caption">Connect 的不同選擇方式</figcaption>
</figure>
<p>假設,只有看到 <code>Private IP address</code>,那麼除非你的網路環境和機器在同個網路環境(例如有 VPN 進入 Azure)那麼是不可能透過 Private IP address 連線進去。</p>
<p>至於怎麼建立出 Public IP 或者 DNS 我另外一篇介紹</p>
<p>這步做完之後,至少會拿到 Public IP 或者 DNS</p>
<h3 id="section-1">確認一下是不是有因為防火墻導致阻擋了連線</h3>
<p>接下來連不連的進去取決於有沒有阻擋。</p>
<p>那這個有幾個部分:</p>
<ol>
<li>在 Azure 上面的 Network Security Group (NSG) 有沒有允許連線?</li>
<li>你的機器內部防火墻是否擋住了這件事?</li>
</ol>
<h4 id="azure-network-security-group-nsg">在 Azure 上面的 Network Security Group (NSG) 有沒有允許連線?</h4>
<p>這個在 Azure 上面很好檢查,我們可以透過:</p>
<p>Virtual Machine => Newtorking 去檢查</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-11-faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue/image-20230215063549-4907mjz.png" class="img-responsive img-fluid" alt="Azure VM 上面的 Networking 畫面" title="Azure VM 上面的 Networking 畫面" /></p>
<figcaption class="figure-caption">Azure VM 上面的 Networking 畫面</figcaption>
</figure>
<ol>
<li>先確認我們規則的 <code>Priority</code> 順序。<code>數字越小,優先級越高</code></li>
<li>確認開的 <code>Port</code> 對不對,以我們要 RDP 的例子,需要開 3389</li>
<li>確認好 <code>Action</code> 是 <code>Allow</code></li>
</ol>
<h4 id="section-2">你的機器內部防火墻是否擋住了這件事?</h4>
<p>就和溝通是雙向的一樣,能不能夠連線除了對方要願意之外,你自己的機器也要允許這件事。</p>
<p>一般來說,不會阻擋這件事,但是如果今天你的電腦是別的地方提供,或許因為資安考量會不允許做這件事。</p>
<p>所以,要驗證這個,最快的方式其實是<mark>換一台電腦試試看</mark>最快。</p>
<p>不過,假設沒辦法換電腦,那麼可以檢查看看作業系統的防火墻,以 Windows 為例:</p>
<ol>
<li><p>打開防火墻設定。可以用:快捷鍵<code>Win + r</code> 然後輸入 <code>wf.msc</code></p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-11-faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue/image-20230215064057-k826iga.png" class="img-responsive img-fluid" alt="Run 執行 wf.msc" title="Run 執行 wf.msc" /></p>
<figcaption class="figure-caption">Run 執行 wf.msc</figcaption>
</figure>
</li>
<li><p>切換到 <code>Outbound Rules</code> 然後檢查有沒有 <code>Remote Port</code>設定是 <code>3389</code>然後被<mark>不允許連線</mark></p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-11-faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue/image-20230215064322-okzm766.png" class="img-responsive img-fluid" alt="Windows Firewall 的設定畫面" title="Windows Firewall 的設定畫面" /></p>
<figcaption class="figure-caption">Windows Firewall 的設定畫面</figcaption>
</figure>
</li>
</ol>
<h3 id="section-3">確認一下是不是你的網路環境導致連線不進去</h3>
<p>到目前為止的環境排查都是針對自己可以掌控的部分。</p>
<p>不過,網路有很多層級,有可能在別的層級就擋下來了,這個最多發生在如果公司內部的網路政策不允許做這件事。</p>
<p>這個最好的排查方式是:<mark>換一個網路</mark>。</p>
<p>例如,連上自己的 4G 網路試試看是否就好了。</p>
<div class="bs-callout bs-callout-info"><p>這個搭配上一個建議就是,換機器也換網路,如果就通了,至少是這兩個之一</p>
</div>
<h3 id="section-4">確認一下是不是因為忘記了帳號密碼所以導致連不進去</h3>
<p>假設都到了這邊,一般來說已經排除了大部分的環境問題,那麼接下來要問一些看起來很明顯的問題。</p>
<p>例如,你的帳號密碼有沒有記錯/輸入錯誤?</p>
<p>這個錯誤訊息和連線不到的訊息其實長的不一樣,不過不一定大家都有認真看。</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-11-faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue/image-20230215065311-6rfc7r4.png" class="img-responsive img-fluid" alt="帳號密碼錯誤截圖" title="帳號密碼錯誤截圖" /></p>
<figcaption class="figure-caption">帳號密碼錯誤截圖</figcaption>
</figure>
<p>假設是 Azure VM 遇到這個,可以透過 <code>Reset password</code> 來解決:</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-11-faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue/image-20230215065429-8cbwgw9.png" class="img-responsive img-fluid" alt="Azure VM 的 Reset Password 畫面" title="Azure VM 的 Reset Password 畫面" /></p>
<figcaption class="figure-caption">Azure VM 的 Reset Password 畫面</figcaption>
</figure>
<ol>
<li>在左邊找到 <code>Reset password</code></li>
<li>輸入登入帳號</li>
<li>輸入登入密碼</li>
<li>再輸入一次密碼</li>
<li>最後按下 <code>Update</code></li>
</ol>
<p>大概等個幾分鐘讓他執行,在嘗試一次</p>
<h2 id="section-5">總結</h2>
<p>一般來說,如果上面的流程都走完,那麼連線一般就不太會有問題。</p>
<p>假設上面廢話太多,懶得看,大家只要記得一個規則,那麼可以從:</p>
<ol>
<li>換機器</li>
<li>換環境</li>
<li>重新建立 VM (避免例如不小心把 Public IP 刪掉之類的)</li>
</ol>
<p>基本上就沒問題啦。</p>
<p>如果你有更好的排查方式,歡迎和我分享哦。</p>
<p></p>
<p>對於任何第一次上手任何雲端服務的時候,第一件事估計都是建立出 Virtual Machine (虛擬機器),算是雲端的 Hello World 吧。</p>
<p>這個時候,如果遇到無法連線(這邊的連線指的是透過 Remote Desktop Protocol)進去估計會很沮喪,導致撞墻不想繼續下去。</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-11-faq-how-to-troubleshoot-azure-virtual-machine-connection-remote-desktop-issue/image-20230215063151-0cpnx3h.png" class="img-responsive img-fluid" alt="到底為什麼連不到" title="到底為什麼連不到" /></p>
<figcaption class="figure-caption">到底為什麼連不到</figcaption>
</figure>
<p>我這篇想要先介紹一下,如果遇到這件事,可以從什麼角度去嘗試排除問題。</p>
<p>這邊主要是會以 Azure 的 Windows VM,不過基本概念在任何雲端平台都是一樣的概念。</p>
https://blog.alantsai.net/posts/2023/02/faq-azure-devops-how-to-use-api-to-delete-test-result
怎麼在 Azure DevOps Test Plan 刪除 Test Result - 了解如何用 API 溝通 | FAQ
2023-02-01T19:00:00Z
<p>Azure DevOps 是一個微軟提供的 End to End 的軟體開發工具。從需求管理到最後面的 Test 或者 Artifact 管理涵蓋了這個軟體開發的生命週期。</p>
<p>我曾經有幾個影片介紹過 <a href="/tags/%E3%80%8Cazure-devops%E3%80%8D">Azure DevOps</a> 裡面和 Test 有關的功能:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/GhqTIzDqV5A" data-src="https://www.youtube.com/embed/GhqTIzDqV5A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
<p>前陣子有人問我,如果需要刪掉 Test Plan 裡面的 Test Result 可以怎麼做到這件事?</p>
<p>去查了一下,微軟沒有開放操作界面做這件事,不過有<mark>提供 API</mark>。所以是可以達成。</p>
<p>雖然說這篇主要是針對 Azure DevOps Test Result 進行操作,但是一樣的概念可以用作於想透過 API 來管理 Azure DevOps 但是不知道怎麼做(例如自動化抓資料來產生績效報表),那這篇也可以節省你一些研究時間。</p>
<!--more-->
<h2 id="section">執行順序</h2>
<ol>
<li>先抓出要刪除的 Test Result Id</li>
<li>準備好要打 API 的 token</li>
<li>執行刪除的 API</li>
</ol>
<h2 id="test-result-id">先抓出要刪除的 Test Result Id</h2>
<p>假設我們要刪除的那個 Test Result 的那筆資料如下</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-01-faq-azure-devops-how-to-use-api-to-delete-test-result/image-20221208065432-bm2hnzq.png" class="img-responsive img-fluid" alt="要刪掉的 test result" title="要刪掉的 test result" /></p>
<figcaption class="figure-caption">要刪掉的 test result</figcaption>
</figure>
<p>API 需要有 3 個參數:</p>
<ol>
<li><code>organization</code> - Azure DevOps 的組織名稱。會是網址 Host 的一部分。</li>
<li><code>project</code> - 專案的名稱</li>
<li><code>runId</code> - 測試結果的 Id</li>
</ol>
<p>這 3 個參數可以從結果那頁看到:</p>
<figure class="figure">
<figcaption class="figure-caption"><img src="/posts/2023/02/2023-02-01-faq-azure-devops-how-to-use-api-to-delete-test-result/image-20221208072537-mn77fk0.png" class="img-responsive img-fluid" alt="範例資料" title="範例資料" /> </figcaption>
<figcaption class="figure-caption">範例資料</figcaption>
</figure>
<p>以上面的範例來說:</p>
<ol>
<li><code>organization</code> 就是:<code>alantsai-sample</code></li>
<li><code>project</code> 就是:<code>TestPlanProject</code></li>
<li>runId 就是:<code>1000028</code></li>
</ol>
<h2 id="api-token">準備好要打 API 的 token</h2>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-01-faq-azure-devops-how-to-use-api-to-delete-test-result/image-20221208070323-gh317jy.png" class="img-responsive img-fluid" alt="找到 Personal Access Token 的位置" title="找到 Personal Access Token 的位置" /></p>
<figcaption class="figure-caption">找到 Personal Access Token 的位置</figcaption>
</figure>
<ol>
<li>先點右上角帳號頭像左邊的人像 icon</li>
<li>找到倒數第二個的 Personal access tokens - 也可以簡稱為 PAT</li>
</ol>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-01-faq-azure-devops-how-to-use-api-to-delete-test-result/image-20221208070606-ys3otx7.png" class="img-responsive img-fluid" alt="建立 PAT" title="建立 PAT" /></p>
<figcaption class="figure-caption">建立 PAT</figcaption>
</figure>
<ol>
<li>選擇 <code>New Token</code></li>
<li>輸入自己會記得的名臣到 <code>Name</code></li>
<li>在 <code>Scopes</code> 的部分選擇 <code>Test Management => Read & write</code></li>
<li>選擇 <code>Create</code></li>
</ol>
<div class="bs-callout bs-callout-info"><p>這邊還可以設定多久會失效等。越短越好哦。或者用完之後刪掉 PAT。</p>
</div>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-01-faq-azure-devops-how-to-use-api-to-delete-test-result/image-20221208070806-s56slz1.png" class="img-responsive img-fluid" alt="看到 PAT" title="看到 PAT" /></p>
</figure>
<p>下個畫面會看到一組亂碼,就是 PAT 碼。</p>
<p>記得把它存下來。</p>
<div class="bs-callout bs-callout-warning"><p>記得不要把 PAT 給別人,不然別人可以做和你一樣的操作
如果這邊沒有儲存下來,那麼就要建立新的 PAT</p>
</div>
<h2 id="api">執行刪除的 API</h2>
<p>要執行的 API 是這個:<a href="https://learn.microsoft.com/en-us/rest/api/azure/devops/test/runs/delete?view=azure-devops-rest-6.0&tabs=HTTP&WT.mc_id=AZ-MVP-5003856&fbclid=IwAR3rqzDM80x4k2ubBFPIF6MTfXrPTRjQmBVFYHs4robI4cs8Ze7h_XiEShA">Runs - Delete</a></p>
<p>我們可以用這個工具協助我們:<a href="https://hoppscotch.io/">hoppscotch</a></p>
<p>API 的網址是:<code>DELETE https://dev.azure.com/{organization}/{project}/_apis/test/runs/{runId}?api-version=6.0</code></p>
<p>只要 <code>{}</code> 這種的都要替換成為我們上面得到的值,以我的為例就是:
<code>DELETE https://dev.azure.com/alantsai-sample/TestPlanProject/_apis/test/runs/1000028?api-version=6.0</code></p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-01-faq-azure-devops-how-to-use-api-to-delete-test-result/image-20221208072735-oesd89i.png" class="img-responsive img-fluid" alt="設定要輸入的內容" title="設定要輸入的內容" /></p>
<figcaption class="figure-caption">設定要輸入的內容</figcaption>
</figure>
<ol>
<li>先選擇到 <code>DELETE</code></li>
<li>把上面組出來那個網址放進去</li>
<li>選擇 <code>Authorization</code> 這個 Tab</li>
<li>把 <code>Authorization Type</code> 改成 <code>Basic Auth</code></li>
<li>把登入用的帳號輸入進去</li>
<li>把稍早 PAT 的內容輸入裡面的輸入框作為密碼</li>
</ol>
<p>最後我們可以按網址旁邊的 <code>Send</code> 去做執行</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-01-faq-azure-devops-how-to-use-api-to-delete-test-result/image-20221208072914-s5kl23q.png" class="img-responsive img-fluid" alt="執行結果" title="執行結果" /></p>
<figcaption class="figure-caption">執行結果</figcaption>
</figure>
<ol>
<li>點下 <code>Send</code> 這個按鈕</li>
<li>會看到下面回傳結果是 <code>204</code> 代表有執行成功</li>
</ol>
<p>回到 Azure DevOps 會看到結果不見了</p>
<figure class="figure">
<p><img src="/posts/2023/02/2023-02-01-faq-azure-devops-how-to-use-api-to-delete-test-result/image-20221208073047-tt14bpd.png" class="img-responsive img-fluid" alt="刪掉成功" title="刪掉成功" /></p>
<figcaption class="figure-caption">刪掉成功</figcaption>
</figure>
<div class="bs-callout bs-callout-warning"><p>注意:刪掉之後就不見了哦。最好先拿一些不重要的測試看看。</p>
</div>
<h2 id="section-1">結語</h2>
<p>這篇主要介紹了如何透過 API 的方式來達到刪除 Azure DevOps 的 Test Result。</p>
<p>如果和 Azure DevOps 的互動想要自動化並且節省一些時間,那麼透過 API 是一個最好的方式。這篇取得 PAT 等方式都是適用,剩下只是研究一下想做的事情的 API 怎麼呼叫而已。</p>
<p>如果用 Azure DevOps 來管理單子,那麼只要規則訂好績效報表可以用自動化產出,或許就可以剩下你非常多時間哦。</p>
<p>如果你有什麼用法歡迎留言分享哦。</p>
<p>Azure DevOps 是一個微軟提供的 End to End 的軟體開發工具。從需求管理到最後面的 Test 或者 Artifact 管理涵蓋了這個軟體開發的生命週期。</p>
<p>我曾經有幾個影片介紹過 <a href="/tags/%E3%80%8Cazure-devops%E3%80%8D">Azure DevOps</a> 裡面和 Test 有關的功能:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/GhqTIzDqV5A" data-src="https://www.youtube.com/embed/GhqTIzDqV5A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
<p>前陣子有人問我,如果需要刪掉 Test Plan 裡面的 Test Result 可以怎麼做到這件事?</p>
<p>去查了一下,微軟沒有開放操作界面做這件事,不過有<mark>提供 API</mark>。所以是可以達成。</p>
<p>雖然說這篇主要是針對 Azure DevOps Test Result 進行操作,但是一樣的概念可以用作於想透過 API 來管理 Azure DevOps 但是不知道怎麼做(例如自動化抓資料來產生績效報表),那這篇也可以節省你一些研究時間。</p>
https://blog.alantsai.net/posts/2023/01/azure-tool-how-to-find-better-vm-sku-using-azure-vm-comparison
使用 Azure VM Comparison 來找出類似規格的 VM
2023-01-13T19:00:00Z
<p>在 <a href="/posts/2023/01/azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector">上一篇</a> 我們看了如何從需求的角度來找出適合的 VM 規格</p>
<p>不過假設今天是要反過來呢?</p>
<p>也就是假設已經有用了某個規格,想要知道有沒有更好的規格那怎麼辦呢?</p>
<p>今天介紹的 Azure VM Comparision 就是要解決這個問題</p>
<p>來看看怎麼使用</p>
<!--more-->
<h2 id="azure-vm-comparison">什麼是 Azure VM Comparison?怎麼使用</h2>
<p>可以從這個網址去存取:</p>
<p><a href="https://azureprice.net/">https://azureprice.net/</a></p>
<p>會看到下面這個截圖的內容:</p>
<p><img src="/posts/2023/01/2023-01-13-azure-tool-how-to-find-better-vm-sku-using-azure-vm-comparison/image-20230317155542-g4w352m.png" class="img-responsive img-fluid" alt="image" title="Azure VM Comparison 的主頁" /></p>
<figure class="figure">
<figcaption class="figure-caption">Azure VM Comparison 的主頁</figcaption>
<ol>
<li>可以選擇要看到的幣別</li>
<li>要看到的主要 Region</li>
<li>金額計算方式。小時、天、月、年</li>
<li>什麼模式的 VM。一般的還是 spot instance</li>
<li>什麼的價格。牌價,還是 RI 1 年還是 RI 3年</li>
<li>VM 規格的名稱,當滑動上去的時候,會有個小的 tooltip 顯示每個數字的含義,以及一些重要資訊例如什麼時候 retire</li>
<li>如果想看看有沒有同類型的規格但是更便宜,可以選 <code>find better</code></li>
<li>如果想要知道這個規格在那個 Region 最便宜,可以選 <code>compare</code></li>
<li>如果想要比對規格,可以在規格的左邊 checkbox 點一下,就可以加入比對操作</li>
</ol>
<h2 id="b4ms">假設有人推薦 B4ms 比較好,應該如何評估?</h2>
<p>延續和上一篇一樣的情境,需要的規格是:</p>
<ol>
<li>Windows Server 2022</li>
<li>SQL Server Enterprise 2022</li>
<li>16 GB 記憶</li>
<li>4 CPU</li>
</ol>
<p>使用 Azure Virtual Machine Selector 推薦的是:<code>D4as_v5</code></p>
<p>這個時候你的同事說,有個更好的規格叫做 <code>B4ms</code>,請問如何比較是否真的比較好?</p>
<p>我們用 Azure VM Comparison 來看看怎麼比較:</p>
<ol>
<li><p><img src="/posts/2023/01/2023-01-13-azure-tool-how-to-find-better-vm-sku-using-azure-vm-comparison/image-20230317160726-64pss6x.png" class="img-responsive img-fluid" alt="image" title="在輸入框輸入 `D4as_v5`,找到規格把它勾選起來" /></p>
<figure class="figure">
<figcaption class="figure-caption">在輸入框輸入 <code>D4as_v5</code>,找到規格把它勾選起來</figcaption>
</figure>
</li>
<li><p><img src="/posts/2023/01/2023-01-13-azure-tool-how-to-find-better-vm-sku-using-azure-vm-comparison/image-20230317160823-hwntwc5.png" class="img-responsive img-fluid" alt="image" title="把輸入框內容改成 `b4ms` 然後把它勾起來,這個時候可以點下 Compare 按鈕" /></p>
<figure class="figure">
<figcaption class="figure-caption">把輸入框內容改成 <code>b4ms</code> 然後把它勾起來,這個時候可以點下 Compare 按鈕</figcaption>
</figure>
</li>
<li><p>可以看到兩個規格的比較表</p>
<p><a href="https://azureprice.net/compare?vms=Standard_D4as_v5,Standard_B4ms">https://azureprice.net/compare?vms=Standard_D4as_v5,Standard_B4ms</a></p>
</li>
</ol>
<p>我們來抓一下幾個可以注意的點:</p>
<p><img src="/posts/2023/01/2023-01-13-azure-tool-how-to-find-better-vm-sku-using-azure-vm-comparison/image-20230318115805-4xxyuxn.png" class="img-responsive img-fluid" alt="image" title="比對畫面的詳細資訊" /></p>
<figcaption class="figure-caption">比對畫面的詳細資訊</figcaption>
</figure>
<ol>
<li>首先可以看到 VM 的每個字母的含義。這邊要注意的是 B 代表的是 <code>Economical burstable</code> 這個含義我們稍等說</li>
<li><code>Performance Score</code> 雖然 CPU 規格一樣,但是因為硬體用的不同,所以實際的效能可能不同。如果熟悉 Azure VM 就知道 ACU 這個單位,而 Performance Score 則是更進一步,用工具壓測出來的數字結果。<br />
以這個範例可以看到 D4as_V5 比較好一點</li>
<li><code>Avg Price Diff</code> 這個則是從費用的角度看看那個比較貴。以這個為例 D4as_V5 會比較貴一點</li>
</ol>
<p>回到一下 <code>Economical burstable</code> 這件事,如果去查官網 B 系列機器的介紹:</p>
<p><a href="https://learn.microsoft.com/en-us/azure/virtual-machines/sizes-b-series-burstable?WT.mc_id=AZ-MVP-5003856">B-series burstable virtual machine sizes</a></p>
<p><img src="/posts/2023/01/2023-01-13-azure-tool-how-to-find-better-vm-sku-using-azure-vm-comparison/image-20230318121938-sy2f4lt.png" class="img-responsive img-fluid" alt="image" title="引述一段關於 Burstable 的含義" /></p>
<p>由此可以看出,如果假設今天需要的是持續性的 CPU 運算,那麼 B 系列就會不適合</p>
<h3 id="section">如果今天已經用了某個規格,怎麼知道還有那些其他也適合?</h3>
<p>除了上面提到的那種方式來查類似規格,還有一個是看某一個規格的詳細頁。</p>
<p>譬如說:<a href="https://azureprice.net/vm/Standard_B4ms">Standard_B4ms</a></p>
<p>下面會有個 <code>Similar alternative VMs</code> 也可以從這邊看到類似規格以及效能的部分:</p>
<p><img src="/posts/2023/01/2023-01-13-azure-tool-how-to-find-better-vm-sku-using-azure-vm-comparison/image-20230318123201-t1zu5kw.png" class="img-responsive img-fluid" alt="image" title="Similar alternative VMs 的畫面部分" /></p>
<p>這個也可以在條例頁的時候,點 <code>find better</code> 來呼叫出一樣的內容</p>
<h2 id="section-1">結語</h2>
<p>透過 Azure VM Comparison 這個工具,相信對於要怎麼比對規格有個更好的確認方式。</p>
<p>所以當 Azure VM Selector 和 Azure VM Comparison 結合起來的時候,就會是一個從需求面,一個從規格面來找到最適合需求的 VM。</p>
<p>以上就是這兩個工具的介紹,如果大家有更好的做法也歡迎和我分享哦</p>
<p>在 <a href="/posts/2023/01/azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector">上一篇</a> 我們看了如何從需求的角度來找出適合的 VM 規格</p>
<p>不過假設今天是要反過來呢?</p>
<p>也就是假設已經有用了某個規格,想要知道有沒有更好的規格那怎麼辦呢?</p>
<p>今天介紹的 Azure VM Comparision 就是要解決這個問題</p>
<p>來看看怎麼使用</p>
https://blog.alantsai.net/posts/2023/01/azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector
Azure 的 Virtual Machine 規格這麼多,怎麼挑選適合的?Azure VM Selector 工具介紹
2023-01-04T19:00:00Z
<p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230315062704-s0415uk.png" class="img-responsive img-fluid" alt="Azure VM 規格 707 種到底應該選那個?" title="Azure VM 規格 707 種到底應該選那個?" /></p>
<figure class="figure">
<figcaption class="figure-caption">Azure VM 規格 707 種到底應該選那個?</figcaption>
<p>剛接觸 Azure 的使用者,第一個看的服務一般來說會是 Virtual Machine (VM)</p>
<p>這時候會遇到的第一個問題就是,規格這麼多,到底那個規格是適合的?</p>
<p>這篇我們來介紹其中的一個工具 Azure VM Selector,看看能夠怎麼協助我們</p>
<!--more-->
<h2 id="azure-vm-selector">Azure VM Selector 是什麼?怎麼用</h2>
<p>它是一個線上的工具,可以在這邊存取的到:</p>
<p><a href="https://azure.microsoft.com/en-us/pricing/vm-selector/?WT.mc_id=AZ-MVP-">https://azure.microsoft.com/en-us/pricing/vm-selector/?WT.mc_id=AZ-MVP-5003856</a></p>
<p>就會看到以下畫面:</p>
<p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317145341-b0lb60e.png" class="img-responsive img-fluid" alt="image" title="Azure VM Selector 的開始畫面" /></p>
<figcaption class="figure-caption">Azure VM Selector 的開始畫面</figcaption>
</figure>
<p>可以依照三個不同的角度來找到適合的機器規格:</p>
<ol>
<li>依照使用情境(Workload)</li>
<li>依照作業系統和軟體</li>
<li>依照 Region</li>
</ol>
<p>如果今天是從地端到雲端,有個很明顯想用的作業系統和軟體就可以從第二個開始。</p>
<p>舉例來說,假設今天的需求是需要一台:</p>
<ol>
<li>Windows Server 2022</li>
<li>SQL Server Enterprise 2022</li>
<li>16 GB 記憶</li>
<li>4 CPU</li>
</ol>
<p>那麼可以跟著以下步驟:</p>
<ol>
<li><p>選擇:<code>Find VMs by OS and software</code></p>
<p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317145709-r3pgyqm.png" class="img-responsive img-fluid" alt="image" title="選擇 Find VMs by OS and software 的 Start Here" /></p>
<figure class="figure">
<figcaption class="figure-caption">選擇 Find VMs by OS and software 的 Start Here</figcaption>
</figure>
</li>
<li><p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317145808-vypumf8.png" class="img-responsive img-fluid" alt="image" title="選擇 Windows,SQL Service,然後 SQL Enterprise,可以注意右邊的 VM 數量" /></p>
<figure class="figure">
<figcaption class="figure-caption">選擇 Windows,SQL Service,然後 SQL Enterprise,可以注意右邊的 VM 數量</figcaption>
</figure>
</li>
<li><p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317145916-9fonz4r.png" class="img-responsive img-fluid" alt="image" title="選擇什麼類型的 VM" /></p>
<figure class="figure">
<figcaption class="figure-caption">選擇什麼類型的 VM</figcaption>
</figure>
</li>
<li><p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317150009-n6d5cbi.png" class="img-responsive img-fluid" alt="image" title="設定想要的 CPU、Memory - 可以注意到右邊的 VM 數量大幅度的減少了" /></p>
<figure class="figure">
<figcaption class="figure-caption">設定想要的 CPU、Memory - 可以注意到右邊的 VM 數量大幅度的減少了</figcaption>
</figure>
</li>
<li><p>如果有些特殊需求,可以點下面的 <code>Additional VM features</code><br />
<img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317150204-xue540x.png" class="img-responsive img-fluid" alt="image" title="進一步下不同的篩選條件" /></p>
<figure class="figure">
<figcaption class="figure-caption">進一步下不同的篩選條件</figcaption>
</figure>
</li>
<li><p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317150331-7cxm21d.png" class="img-responsive img-fluid" alt="image" title="選擇硬碟的規格 - 如果不確定可以點開 spec 會呈現更多詳細資訊" /></p>
<figure class="figure">
<figcaption class="figure-caption">選擇硬碟的規格 - 如果不確定可以點開 spec 會呈現更多詳細資訊</figcaption>
</figure>
</li>
<li><p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317150436-yp4z4zf.png" class="img-responsive img-fluid" alt="image" title="實際設定要幾個硬碟和要多大空間" /></p>
<figure class="figure">
<figcaption class="figure-caption">實際設定要幾個硬碟和要多大空間</figcaption>
</figure>
</li>
<li><p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317150512-gae4hnq.png" class="img-responsive img-fluid" alt="image" title="最後選擇 Region" /></p>
<figure class="figure">
<figcaption class="figure-caption">最後選擇 Region</figcaption>
</figure>
</li>
<li><p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230317151228-x6pu6nz.png" class="img-responsive img-fluid" alt="image" title="可以切換看到所有推薦的機器規格、可以點了看詳細資訊,或者直接加入計算機" /></p>
<figure class="figure">
<figcaption class="figure-caption">可以切換看到所有推薦的機器規格、可以點了看詳細資訊,或者直接加入計算機</figcaption>
</figure>
</li>
</ol>
<h2 id="section">結語</h2>
<p>透過 Azure VM Selector,可以在知道需要什麼規格的情況下快速找到最適合的 Azure VM。</p>
<p>不過假設今天是要反過來呢?</p>
<p>例如,我已經有某個 Azure VM 規格,我想要知道還有沒有更推薦的可以怎麼做?</p>
<p>下一篇介紹一下 Azure VM Comparison</p>
<p><img src="/posts/2023/01/2023-01-04-azure-tool-how-to-find-appropriate-vm-sku-using-azure-vm-selector/image-20230315062704-s0415uk.png" class="img-responsive img-fluid" alt="Azure VM 規格 707 種到底應該選那個?" title="Azure VM 規格 707 種到底應該選那個?" /></p>
<figure class="figure">
<figcaption class="figure-caption">Azure VM 規格 707 種到底應該選那個?</figcaption>
<p>剛接觸 Azure 的使用者,第一個看的服務一般來說會是 Virtual Machine (VM)</p>
<p>這時候會遇到的第一個問題就是,規格這麼多,到底那個規格是適合的?</p>
<p>這篇我們來介紹其中的一個工具 Azure VM Selector,看看能夠怎麼協助我們</p>
https://blog.alantsai.net/posts/2022/12/event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda
2022 .NET Conf Taiwan 記錄 - 談 Event Driven Architecture 之前,是不是該把 Event 規格搞定? CloudEvents 是什麼?| 活動
2022-12-17T19:00:00Z
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318125358-vlc6j5v.png" class="img-responsive img-responsive img-fluid" alt="image" title="https://www.youtube.com/watch?v=ejI9Y3YLQeU" /></p>
<p>一年一度台灣社群最大的 .NET 相關活動又來了</p>
<p>和前幾年一樣,也是協力主辦和講師的身份參與到活動</p>
<p>在這篇分兩個部分,一個部分是這次分享的主題,另外一個則是協助的一些小插曲</p>
<!--more-->
<h2 id="section">為什麼要講這個主題</h2>
<p>就像一個鄉鎮要富裕起來,第一件事一定是修路。修路這件事隱含的是把<mark>通訊</mark>這個渠道打通,只有通訊順暢了才有更多的機會和可能</p>
<p>同樣道理,當我們要把架構從 Monolithic 改成 Microservice 的時候,遇到的第一個問題也是<mark>通訊</mark></p>
<p>以前,全部都放在一起當然沒有什麼通訊問題,但是當每個領域切開之後,怎麼有效的互相溝通就變得非常重要</p>
<p>通訊廣義一點來說有可以區分為:</p>
<ol>
<li>Synchronous (同步) - 例如透過 API 溝通</li>
<li>Asynchronous (非同步)- 例如透過 Event 或者 Message</li>
</ol>
<p>我這邊主題是 Event,那 Event 的第一步是什麼?</p>
<blockquote class="blockquote">
<p>很剛好,我前面的兩場分別有兩位大大在介紹 API 和讓呼叫 API 變得簡單的 SDK 大家可以參考。</p>
</blockquote>
<p>很多人會想說,就是開始研究要用什麼 Event 服務,或者要用什麼架構把它們組合在一起</p>
<p>這些都對,也都很重要,不過我認為最重要的是你的<mark>服務要有哪些 Event</mark>?</p>
<p>這件事沒有想象中的簡單,訂太大包會導致 Event 傳輸不利,訂太小包會導致後續的人要用不好用</p>
<p>這個和開 Database 的 Table Schema 是一樣的道理,怎麼開出一個合理,然後符合業界標準的規格很重要</p>
<p>所以,就延伸出,那我的 Event 規格應該長成什麼樣子的問題</p>
<h3 id="cloudevents">什麼是業界標準?CloudEvents</h3>
<p>業界標準的目的是當不知道應該長什麼樣子的時候,有個基底可以讓我們遵循。這樣至少當需要和外界溝通的時候,會比較容易</p>
<p>就像是 Design Pattern 一樣,不管實作的是什麼,只要說這個是 xxx pattern 大家就很容易理解</p>
<p>不管有沒有遵循某個業界標準,最重要的是一定要一致</p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318171632-1kaq23i.png" class="img-responsive img-responsive img-fluid" alt="image" title="如果文字不統一,溝通成本就會非常大" /></p>
<p>當進入到 Microservices 的時候,理論上每個系統想怎麼做是那個團隊要負責,但是真的溝通的時候,每個團隊的 Event 都應該要有<mark>一致的風格</mark></p>
<p>當思考 Event 的時候需要考慮到:</p>
<ol>
<li><p>資料格式要支援什麼?</p>
<ol>
<li>什麼欄位是一件事,要用 CSV、XML 還是 JSON?</li>
</ol>
</li>
<li><p>通訊協議要支援什麼?</p>
<ol>
<li>除了常見的 HTTP,是否需要支援 AMQP 還是 MQTT</li>
</ol>
</li>
</ol>
<p>假設真的沒什麼想法,那麼就可以考慮直接用 CNCF 提出的 <a href="https://cloudevents.io/">CloudEvents</a></p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318172142-t791zky.png" class="img-responsive img-fluid" alt="image" title="CloudEvents 的 logo 和目的" /></p>
<figure class="figure">
<figcaption class="figure-caption">CloudEvents 的 logo 和目的</figcaption>
<h3 id="cloudevents-1">CloudEvents 的基本概念</h3>
<p>有核心格式在搭配不同資料格式以及不同通訊協議的建議</p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318172336-p7r618t.png" class="img-responsive img-fluid" alt="image" title="所有的格式描述 - https://github.com/cloudevents/spec " /></p>
<figcaption class="figure-caption">所有的格式描述 - <a href="https://github.com/cloudevents/spec">https://github.com/cloudevents/spec</a></figcaption>
</figure>
<p>並且提供常見程式語言的 SDK:</p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318172535-fpudjt0.png" class="img-responsive img-fluid" alt="image" title="有支援的 SDK - https://github.com/cloudevents/sdk-csharp/blob/main/docs/guide.md " /></p>
<figure class="figure">
<figcaption class="figure-caption">有支援的 SDK - <a href="https://github.com/cloudevents/sdk-csharp/blob/main/docs/guide.md">https://github.com/cloudevents/sdk-csharp/blob/main/docs/guide.md</a></figcaption>
<p>資料格式區分兩個部分:</p>
<ol>
<li>Context Metadata - 會定義出每個資料格式類型應該有那些欄位</li>
<li>Event Metadata - 這個部分就是隨著應用不同而自由發揮</li>
</ol>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318173037-dtn4dgv.png" class="img-responsive img-fluid" alt="image" title="範例 - JSON Event 的格式" /></p>
<figcaption class="figure-caption">範例 - JSON Event 的格式</figcaption>
</figure>
<h3 id="migration">如果要導入記得先做好 Migration 計劃</h3>
<p>簡報最後面是在說明,如何從既有的格式轉換成為 CloudEvents</p>
<p>由於應用可能已經有在使用舊的格式,那麼可以透過 Adapter 的方式同時新舊兼容,最後慢慢把舊的格式淘汰掉</p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318173505-mlk8bto.png" class="img-responsive img-fluid" alt="image" title="透過 Adapter 轉成 CloudEvents 格式" /></p>
<figure class="figure">
<figcaption class="figure-caption">透過 Adapter 轉成 CloudEvents 格式</figcaption>
<h3 id="section-1">參考資料</h3>
<p>如果想要看到完整內容,歡迎參考:</p>
<ol>
<li><a href="https://www.youtube.com/watch?v=ejI9Y3YLQeU">Youtube 影片</a></li>
<li>PPT 簡報</li>
</ol>
<h2 id="section-2">活動花絮</h2>
<p>這次是三軌的議程,不過兩軌是透過錄播的方式,只有其中一軌是即時直播</p>
<p>所以當天是借用微軟大的會議室來做直播</p>
<p>當天小弟的主要工作是幫講師們刷門禁和電梯,所以吃完早餐就要開工啦</p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318175140-et5ieeu.png" class="img-responsive img-fluid" alt="image" title="麥當勞早餐,和一日門禁卡" /></p>
<figcaption class="figure-caption">麥當勞早餐,和一日門禁卡</figcaption>
</figure>
<p>在來就是熟悉場地</p>
<p>一開始進去當然就是先拍照啊:</p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318173915-g25vee1.png" class="img-responsive img-fluid" alt="image" title="整個直播現場" /></p>
<figure class="figure">
<figcaption class="figure-caption">整個直播現場</figcaption>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318174105-rzlw9ba.png" class="img-responsive img-fluid" alt="image" title="專業的控場工具" /></p>
<figcaption class="figure-caption">專業的控場工具</figcaption>
</figure>
<p>實際直播者的角度來說看到的是這樣:</p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318174547-hwk34rd.png" class="img-responsive img-fluid" alt="image" title="準備直播的時候先拍一下" /></p>
<figure class="figure">
<figcaption class="figure-caption">準備直播的時候先拍一下</figcaption>
<p>最後有一場是直播的快問快答,整個會場其實是這樣:</p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318175638-953l2sh.png" class="img-responsive img-fluid" alt="image" title="快問快答的場面" /></p>
<figcaption class="figure-caption">快問快答的場面</figcaption>
</figure>
<p>郭董和 David 老師做在對面,剩下 4 位大大做在另外一邊</p>
<p>從現場來看其實隔得滿空,也有點像是在面試,蠻有趣的</p>
<p></p>
<p>以上就是這次活動內容的情況,我們明年在見啦</p>
<p><img src="/posts/2022/12/2022-12-17-event-net-conf-2022-taiwan-lets-talk-about-standardize-event-using-cloudevents-before-talk-about-eda/image-20230318125358-vlc6j5v.png" class="img-responsive img-responsive img-fluid" alt="image" title="https://www.youtube.com/watch?v=ejI9Y3YLQeU" /></p>
<p>一年一度台灣社群最大的 .NET 相關活動又來了</p>
<p>和前幾年一樣,也是協力主辦和講師的身份參與到活動</p>
<p>在這篇分兩個部分,一個部分是這次分享的主題,另外一個則是協助的一些小插曲</p>
https://blog.alantsai.net/posts/2022/11/azure-how-to-use-resource-lock-to-prevent-accidental-deletion-resource
怎麼可以避免資源被誤刪?所有 Production 環境都應該要上 Resource Lock
2022-11-04T19:00:00Z
<p>當真的開始要在正式環境管理 Azure 資源的時候,就會開始遇到一些管理上面的問題</p>
<p>舉例來說,不應該給權限的就不應該要給。譬如說假設某些人員不應該有刪除的權限,那麼就不應該給他</p>
<p>但是假設今天是他本來就應該<mark>有權限</mark>,但是不小心<mark>誤刪</mark>怎麼辦?</p>
<p>或者說把 Production 機器誤以為 QA 環境結果把機器給關機了怎麼辦?</p>
<p>這個時候就不是設定權限給太大的問題</p>
<p>這時候就應該要好好利用 Resource Lock</p>
<p>這篇,來看一下 Resource Lock 是什麼以及該怎麼用</p>
<!--more-->
<h2 id="resource-lock">什麼是 Resource Lock?</h2>
<p>其實概念很簡單,在要被保護的資源上面可以上一個鎖頭避免<mark>不小心</mark>刪掉</p>
<p>這個鎖頭可以被設定在:</p>
<ol>
<li>Subscription</li>
<li>Resource Group</li>
<li>Resource</li>
</ol>
<p>這三個層級裡面,並且會被從上往下繼承</p>
<p>鎖又可以區分兩種:</p>
<ol>
<li><p>Read-Only</p>
<ol>
<li>代表資源變成只能夠讀,不能夠做任何<mark>異動</mark></li>
</ol>
</li>
<li><p>Delete</p>
<ol>
<li>代表資源不能夠<mark>被刪除</mark></li>
</ol>
</li>
</ol>
<p>這兩個類型的鎖最大差異在於 Read-Only 更加嚴謹</p>
<p>舉例來說,如果有台 VM 目前是<mark>開機狀態</mark>,如果有被鎖上 Read-Only Lock,代表不能夠被關機。原因很簡單,因為開關機會<mark>異動</mark>機器的狀態</p>
<p>所以如果有上了 Read-Only Lock,代表不會被<mark>不小心關機</mark></p>
<h2 id="resource-lock-resource-group">嘗試設定 Resource Lock 在 Resource Group 上面並且嘗試刪除</h2>
<p><img src="/posts/2022/11/2022-11-04-azure-how-to-use-resource-lock-to-prevent-accidental-deletion-resource/image-20230318195029-h02qz58.png" class="img-responsive img-fluid" alt="image" title="Resource Lock 的設定" /></p>
<ol>
<li>先找到某一個 Resource Group,然後從左邊搜尋 <code>Lock</code></li>
<li>選擇上面的 <code>Add</code></li>
<li>可以設定 Lock 的名稱</li>
<li>可以設定 Lock 的類型</li>
<li>可以加上描述</li>
</ol>
<p>以上面操作為例,是加上一個 Delete Resource Lock,加好之後,當我們想要刪 Resource 的時候就會出現錯誤</p>
<p><img src="/posts/2022/11/2022-11-04-azure-how-to-use-resource-lock-to-prevent-accidental-deletion-resource/image-20230318195200-03ooejw.png" class="img-responsive img-fluid" alt="image" title="被鎖住的沒辦法被刪掉" /></p>
<figure class="figure">
<figcaption class="figure-caption">被鎖住的沒辦法被刪掉</figcaption>
<h2 id="section">結語</h2>
<p>Resource Lock 是一個在正式環境都要利用起來的設定</p>
<p>只有這樣,才可以避免不小心資源被刪掉的問題</p>
</figure>
<p>當真的開始要在正式環境管理 Azure 資源的時候,就會開始遇到一些管理上面的問題</p>
<p>舉例來說,不應該給權限的就不應該要給。譬如說假設某些人員不應該有刪除的權限,那麼就不應該給他</p>
<p>但是假設今天是他本來就應該<mark>有權限</mark>,但是不小心<mark>誤刪</mark>怎麼辦?</p>
<p>或者說把 Production 機器誤以為 QA 環境結果把機器給關機了怎麼辦?</p>
<p>這個時候就不是設定權限給太大的問題</p>
<p>這時候就應該要好好利用 Resource Lock</p>
<p>這篇,來看一下 Resource Lock 是什麼以及該怎麼用</p>
https://blog.alantsai.net/posts/2022/10/prepare-for-az-204-what-is-cloud-native-app
Cloud Native App 是什麼? | AZ-204 在考什麼
2022-10-16T19:00:00Z
<figure class="figure">
<p><img src="/posts/2022/10/2022-10-16-prepare-for-az-204-what-is-cloud-native-app/01-Cloud-Native-Application-%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9FAZ-204%E5%9C%A8%E8%80%83%E4%BB%80%E9%BA%BC-20221017083022-7uu8s6e.jpg" class="img-responsive img-fluid" alt="01 Cloud Native Application 是什麼?AZ-204 在考什麼" /></p>
<figcaption class="figure-caption">Cloud Native App 是什麼,AZ-204 在考什麼</figcaption>
</figure>
<p>以前有考過微軟和開發相關證照的人一定會對於像是 70-483 或者 70-486 這種代碼有印象(如果沒看過很好,表示還年輕 XD),那種證照比較專注於實際怎麼開發,但是大家會發現那些現在都 retire 掉了。</p>
<p>而微軟目前和開發比較沾上邊的就只有 AZ-204:Developing Solutions for Microsoft Azure。</p>
<p>而 AZ-204 最主要的講的就是怎麼做出 Cloud Native App。</p>
<p>當大家在搜尋和雲端開發相關知識的時候,相信也常常會看到 <mark>Cloud Native Application</mark> 或者<mark>雲原生應用</mark>這個名詞。</p>
<p>這個到底指的是什麼?什麼 Application 才算是 Cloud Native App?</p>
<p>這篇我們來簡單看一下這個概念。</p>
<!--more-->
<h2 id="section">回顧一下上雲之路</h2>
<p>在進入 Cloud Native App 之前,當然先了解一下什麼是非 Cloud Native App。</p>
<p>這個就讓我想到 2018 在北京曾經有做過一場關於上雲之路的簡報(有興趣可以看看:<a href="/posts/2018/04/review-stud420180421-beijing-azure-bootcamp-azure-migration">2018 北京 Azure bootcamp - Azure Migration 上雲之路</a>),那時候還只是 Cloud Optimized Application,不過其實離 Cloud Native Application 也沒多遠了。</p>
<figure class="figure">
<p><img src="/posts/2022/10/2022-10-16-prepare-for-az-204-what-is-cloud-native-app/image-20221016172630-nz6xm6k.png" class="img-responsive img-fluid" alt="image" title="2018 核心概念" /></p>
<figcaption class="figure-caption">2018 簡報核心概念</figcaption>
</figure>
<p>在當時,主要介紹是前 3 個部分:</p>
<ol>
<li>Existing apps on-prem - 這個就是沒上雲之前全部都放在地端。那這個的優略相信大家都清楚了</li>
<li>Lift and Shift - 純粹把地端的 VM 搬上雲就已經有非常多的優勢,因為可以使用到 IaaS 相關的好處</li>
<li>Cloud Optimized - 從 IaaS 轉到 PaaS,在這個過程當中當然應用可能需要做一些調整,也就是所謂的 modernized、refactor 和 rewrite。舉個例子來說,如果應用是 web 並且還在使用 session,那麼雲端的 scale 就沒辦法利用到極致,畢竟一定要導到同一台機器就可能導致資源運用不平均。</li>
</ol>
<p>其實,Cloud Native App 前面和這個沒什麼兩樣,只是後面的部分也些許不同而已。</p>
<p>回顧完了,4年後,來看一下那現在看到的應該長什麼樣子。</p>
<h2 id="cloud-native-app">什麼是 Cloud Native App?</h2>
<p>我們可以先從類似於剛剛看到的圖來看看所謂的 Cloud Native App:</p>
<figure class="figure">
<p><img src="/posts/2022/10/2022-10-16-prepare-for-az-204-what-is-cloud-native-app/image-20221016173619-9zdq6zk.png" class="img-responsive img-fluid" alt="image" title="Application 的階段。來源:https://learn.microsoft.com/en-us/dotnet/architecture/modernize-with-azure-containers/modernize-existing-apps-to-cloud-optimized/what-about-cloud-native-applications?WT.mc_id=AZ-MVP-5003856" /></p>
<figcaption class="figure-caption">Application 的階段。<a href="https://learn.microsoft.com/en-us/dotnet/architecture/modernize-with-azure-containers/modernize-existing-apps-to-cloud-optimized/what-about-cloud-native-applications?WT.mc_id=AZ-MVP-5003856">來源</a></figcaption>
</figure>
<p>前面三個階段大同小異,不過到了 Cloud Native,我們可以看到幾個關鍵字:</p>
<ol>
<li>Microservice Architecture - 微服務架構</li>
<li>Architected for the cloud - 需要重新調整程式碼</li>
</ol>
<p>這幾個實際和技術面有關的部分我們等等展開,不過我們先看一下,什麼是 cloud Native。</p>
<h3 id="cloud-native">什麼是 Cloud Native?</h3>
<p><a href="https://www.cncf.io/">Cloud Native Computing Foundation</a> 提供的<a href="https://github.com/cncf/foundation/blob/main/charter.md">定義</a>是:</p>
<blockquote class="blockquote">
<p>Cloud-native technologies empower organizations to build and run <mark>scalable applications</mark> in modern, dynamic environments such as public, private, and hybrid clouds. <mark>Containers, service meshes, microservices</mark>, <mark>immutable infrastructure</mark>, and <mark>declarative APIs</mark> exemplify this approach.</p>
</blockquote>
<blockquote class="blockquote">
<p>These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make <mark>high-impact changes frequently and predictably with minimal toil</mark>.</p>
</blockquote>
<p>簡單來說,Cloud Native 就是 <mark>speed</mark> 和 <mark>agility</mark>。既要可以快速反映市場需求,同時面對越來越複雜的商業應用也要能夠快速的回應。</p>
<p>這個時候利用雲端的力量就變得很重要啦。</p>
<p>常看 DevOps 的也會覺得這些描述很熟悉,全部都是有關聯。</p>
<p>如果在展開一些,我們可以看到下圖是微軟總結的幾個支柱:</p>
<figure class="figure">
<p><img src="/posts/2022/10/2022-10-16-prepare-for-az-204-what-is-cloud-native-app/image-20221016180218-kzc47p0.png" class="img-responsive img-fluid" alt="image" title="Cloud Native 的支柱:[來源](https://learn.microsoft.com/en-us/dotnet/architecture/cloud-native/definition?WT.mc_id=AZ-MVP-5003856)" /></p>
<figcaption class="figure-caption">Cloud Native 的支柱:<a href="https://learn.microsoft.com/en-us/dotnet/architecture/cloud-native/definition?WT.mc_id=AZ-MVP-5003856">來源</a></figcaption>
</figure>
<p>由於篇幅的關係,這邊沒辦法每個介紹,但是簡單列一下:</p>
<ol>
<li>Modern Design - 什麼叫做現代化設計呢?簡單來說有人有整理 Twelve-Factor Application 列出了 12個應該要有的設計。不過後續還有持續擴充,所以有時候稱之為 12+ factor。舉個例子來說,API First 就是其中之一,當要走 Microservices 沒有 API 肯定不行。<br />
這裡面也有包含什麼算是好的雲端應用的部分,這個環節會是 AZ-304 的範疇,有機會在和大家介紹。</li>
<li>Microservices - 既然要有 speed 又要有 agility,那麼所有東西都封裝在一起肯定不行,因此 Microservices 就進來了。這個我們後面展開。</li>
<li>Container - 容器化技術的重要性相信大家都知道(如果不知道趕快去惡補一下),也是因為有 Containers 也才讓 Microservices 變得更加容易管理和組合出來。</li>
<li>Backing Service - 背後當然需要有些雲服務的支持才有辦法達到使用雲的特性。以 AZ-204 來說當然就是有什麼 Azure 服務可以協助這件事。</li>
<li>Automation - 自動化不用說是 DevOps 常在講的一件事。也是透過自動化才能夠快速把系統建立出來,並且可以做到 immutable infrastructure。<br />
這個部分會是 AZ-400 的範疇。</li>
</ol>
<h2 id="az-204">AZ-204 看的是什麼?</h2>
<p>在上面的 Cloud Native 的 Pillar 裡面我們可以看到兩個環節是 AZ-204 主要關注的地方:</p>
<ol>
<li>Microservices</li>
<li>Backing Service</li>
</ol>
<p>在精準一點說其實只有 Backing Service,因為 Backing Service 的目的是為了支撐 Microservices。</p>
<p>所以,換句話說 AZ-204 看的更多是在怎麼應用這些 Backing Service。所以並不會介紹怎麼寫 C#、怎麼做架構等這些純開發的事情。</p>
<p>以架構來說(偏 Modern Design),更多是 AZ-305 的職責,純 C# 開發的部分則是沒有相關證照。</p>
<p>大家如果對 Backing Service 的應用不知道從那邊下手,歡迎可以參考一下我在 Tibame 的課程哦:<a href="https://www.tibame.com/course/3327">AZ-204 認證攻略I從Azure著手雲端開發解決方案</a>。</p>
<h2 id="section-1">總結</h2>
<p>在這篇,我們簡單看了一下什麼是 Cloud Native App。</p>
<p>以 AZ-204 的角度來說,主要專注的點在於 Azure 有那些服務能夠支撐起這些用途,並且怎麼在程式碼裡面呼叫使用。</p>
<p>在下一篇,我們簡單談一下關於 Microservice,很多的服務都是為了支撐 Microservices 架構的應用。所以我們先簡單介紹一下 Microservice 是什麼,並且要開發 Microservices 會需要什麼?這樣在了解 AZ-204 的內容就會知道為什麼有這些服務。</p>
<h2 id="section-2">參考資料</h2>
<ol>
<li>免費電子書:<a href="https://dotnet.microsoft.com/download/e-book/cloud-native-azure/pdf?WT.mc_id=AZ-MVP-5003856">Architecting Cloud Native .NET Applications for Azure</a></li>
<li>免費電子書:<a href="https://learn.microsoft.com/en-us/dotnet/architecture/modernize-with-azure-containers/?WT.mc_id=AZ-MVP-5003856">Modernize existing .NET applications with Azure cloud and Windows Containers</a></li>
<li>微軟參考資料:<a href="https://learn.microsoft.com/en-us/dotnet/architecture/cloud-native/introduction?WT.mc_id=AZ-MVP-5003856">Introduction to cloud-native applications</a></li>
</ol>
<figure class="figure">
<p><img src="/posts/2022/10/2022-10-16-prepare-for-az-204-what-is-cloud-native-app/01-Cloud-Native-Application-%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9FAZ-204%E5%9C%A8%E8%80%83%E4%BB%80%E9%BA%BC-20221017083022-7uu8s6e.jpg" class="img-responsive img-fluid" alt="01 Cloud Native Application 是什麼?AZ-204 在考什麼" /></p>
<figcaption class="figure-caption">Cloud Native App 是什麼,AZ-204 在考什麼</figcaption>
</figure>
<p>以前有考過微軟和開發相關證照的人一定會對於像是 70-483 或者 70-486 這種代碼有印象(如果沒看過很好,表示還年輕 XD),那種證照比較專注於實際怎麼開發,但是大家會發現那些現在都 retire 掉了。</p>
<p>而微軟目前和開發比較沾上邊的就只有 AZ-204:Developing Solutions for Microsoft Azure。</p>
<p>而 AZ-204 最主要的講的就是怎麼做出 Cloud Native App。</p>
<p>當大家在搜尋和雲端開發相關知識的時候,相信也常常會看到 <mark>Cloud Native Application</mark> 或者<mark>雲原生應用</mark>這個名詞。</p>
<p>這個到底指的是什麼?什麼 Application 才算是 Cloud Native App?</p>
<p>這篇我們來簡單看一下這個概念。</p>
https://blog.alantsai.net/posts/2022/08/book-review-my-second-translated-book-asp-net-core-5-secure-coding-cookbook
沒想到還有第二本翻譯書:ASP.NET Core 工程師不可不知的 10 大安全性漏洞與防駭方法 (ASP.NET Core 5 Secure Coding Cookbook) | 書評
2022-08-13T19:00:00Z
<figure class="figure">
<p><img src="/posts/2022/08/2022-08-13-book-review-my-second-translated-book-asp-net-core-5-secure-coding-cookbook/image-20220816223225-4sesg5d.png" class="img-fluid" alt="image" title="實體書收到啦" /></p>
<figcaption class="figure-caption">實體書收到啦</figcaption>
</figure>
<p>自從人生的第一本翻譯書弄完之後,我本來想說應該不可能有第二本了。</p>
<p>沒想到,編輯問我說剛好有一本和 ASP.NET Core 以及資安有關的書,看我有沒有興趣。</p>
<p>然後又是一個半年過去,才翻譯完。</p>
<p>作為人生的第二本翻譯書,就要來和大家介紹一下,它是一本什麼內容的書,以及什麼人適合。</p>
<!--more-->
<h2 id="section">書籍的資訊介紹</h2>
<p>這本書之前有預購的應該已經都收到了,有興趣的可以參考天瓏:</p>
<div class="bs-callout bs-callout-info">
<ul>
<li>適合群眾:任何 Web Developer 對於怎麼實作防護 OWASP TOP 10 有關問題的人。如果是 ASP.NET Core 開發者更好,因為範例程式碼用 ASP.NET Core。</li>
<li>購買網址:<a href="https://www.tenlong.com.tw/products/9786263331808">https://www.tenlong.com.tw/products/9786263331808</a></li>
<li>範例程式碼:<a href="https://github.com/PacktPublishing/ASP.NET-Core-Secure-Coding-Cookbook">https://github.com/PacktPublishing/ASP.NET-Core-Secure-Coding-Cookbook</a></li>
</ul>
</div>
<h2 id="section-1">這本書到底在說什麼</h2>
<h3 id="secure-coding">Secure Coding 這件事</h3>
<p>作為一個 Developer,寫出來的程式碼除了不能髒髒的之外,安全也是我們需要納入的第一考量。
常常因為時程的關係,想說最後再來處理,但是如果沒從第一天就有這種 <mark>Secure Coding</mark> 的概念的話,後面要在補上就變得非常麻煩。因為不安全的 code 可能已經散落在整個程式碼裡面了。</p>
<p>那怎麼培養這種 Secure Coding 的概念呢?最簡單當然就是常接觸和資安有關的議題,接觸多了就了解網路的世界有多恐怖 😁。</p>
<p>那從那邊開始下手呢?</p>
<p>有在寫 Web 的一定有聽說過 OWASP(The Open Web Application Security Project) 這個組織。簡單來說他們會定期去搜集和研究網路安全這個部分,並且會持續更新一個清單稱之為 <mark>OWASP Top 10</mark>。</p>
<p>這個 Top 10 代表的是網路安全最需要注意到的 10 個常被攻擊的方式。</p>
<p>譬如說大家最常聽到的 SQL Injection 就是常年位居前三的攻擊方式。(題外話,隨著大家越來越有這方面的意識,最近 Injection 類型的攻擊從本來的榜首掉到了第 3 名,算是可喜可賀吧)。</p>
<p>其他的可能還有什麼 Cross Site Scripting (XSS) 攻擊,Client Side Request Forgery (CSRF) 等,相信要上線前的資安掃描多多少少大家都有看過類似的問題出現在報告裡面。</p>
<p>就算你知道了 OWASP Top 10 之後,很認真的去閱讀,很有可能還會搞不清楚這個描述的攻擊到底是什麼。</p>
<p>先不說內容是英文(有好心的大大會翻成中文)會有一點點的阻力,在加上大部分都是用<mark>文字</mark>描述方式說明這個攻擊是什麼、什麼危害然後怎麼防範。可是如果作為一個從來都沒有接觸過的人,光看這個其實很難有感。</p>
<p>舉個例子來說:我們都知道 SQL Injection 要注意,但是你真的知道:</p>
<ul>
<li>SQL Injection 是怎麼被用來攻擊</li>
<li>會造成什麼後果嗎?</li>
</ul>
<p>這個時候有個範例的程式碼呈現出:</p>
<ul>
<li>有問題的 code 長什麼樣子</li>
<li>實際在運作的時候,會受到怎麼樣的攻擊</li>
<li>怎麼修復好</li>
</ul>
<p>知道怎麼運作,對於我們怎麼防護,就會對學習上很有幫助啦。</p>
<p>而這本書正式使用這種模式在和大家介紹每一個攻擊。</p>
<h3 id="section-2">書的組成</h3>
<p>這本書基本上屬於 Cookbook 類型。</p>
<p>什麼意思呢?就是說像食譜一樣,今天你想做某一道菜,你就會去看某一個食譜,裡面就會告訴你從材料有什麼,然後到一步一步怎麼把它做出來。</p>
<p>不過我自己其實比較喜歡稱之為武功秘籍,每一個招式/套路(食譜)就是對應到一個情境,讓你看完之後再也不怕說不出什麼是【不安全的反序列化】等安全問題。</p>
<p>每一個章節對應到一個資安議題,不用說 OWASP Top 10 都有涵蓋到。</p>
<p>資安議題還會有一些變形,所以每一章在介紹每一個攻擊都會在分為三個部分:</p>
<dl>
<dt>準備</dt>
<dd>要跑這個範例需要注意什麼</dd>
<dt>如何做到這一點...</dt>
<dd>執行這段的細節步驟</dd>
<dt>它是如何運作的...</dt>
<dd>說明整個運作的機制</dd>
</dl>
<p>透過這三個部分,用程式碼的方式帶出整個問題。</p>
<p>不過這並不代表世界上只有 10 種攻擊,所以 Top 10 之外還有其他一些常見的攻擊也有被列出來做說明,以及一些最佳實踐。</p>
<h3 id="section-3">適合群眾</h3>
<p>我個人認為其實適合所有開發者,因為有些攻擊是不管你今天寫什麼都會用到。</p>
<p>譬如說,任何應用程式都有資料庫,那 Injection 類型就要小心。</p>
<p>或許你會說,都什麼年代了還在資料庫,我們都是用 NoSQL 😁,那其實一樣會有其他的問題要注意,例如【不安全的反序列化】。</p>
<p>所以,雖然 OWASP 是面向以 Web 技術為主,但是其實不管今天是什麼類型都會遇到。</p>
<p>所以,如果今天你是:</p>
<ul>
<li>開發人員 - 尤其是 .NET 世界的開發人員</li>
<li>對於 Secure Coding 有興趣的人</li>
<li>對於想要知道這些資安攻擊怎麼執行的人</li>
<li>理論看了想睡覺,想要從 Code 學習的人</li>
</ul>
<p>那這本書都滿適合。</p>
<h3 id="section-4">範例程式碼</h3>
<p>上面其實提到滿多次關於有個可以看到問題並且可以嘗試的 code 對學習上很有幫助。</p>
<p>這邊不得不提一下關於範例程式碼。</p>
<p>首先先說一下,這本書的範例用的是 ASP.NET Core 5 作為範例。</p>
<p>某種程度上大家會疑惑,那到了 ASP.NET Core 6 或者未來還適不適用?</p>
<p>基本上,概念都是一樣的,並且裡面介紹到的套件都是比較知名的套件,因此不用太過於擔心會不會有沒辦法用的問題。</p>
<p>範例程式碼用 <code>before</code> 以及 <code>after</code> 的方式讓大家可以直接 run 起來看看差異,所以對於喜歡從 code 學習的人來說屬於非常方便的一種方式啦。</p>
<h2 id="section-5">結語</h2>
<p>以上就是這本書的介紹。</p>
<p>如果大家對於裡面的內容有什麼問題,都歡迎敲我哦。</p>
<h2 id="section-6">參考資料</h2>
<ul>
<li><p><a href="https://owasp.org/www-project-top-ten/">OWASP Top 10</a> - 英文版本的頁面,裡面列出了 2017 年和 2021 年差異比較,並且每一個攻擊的細節都可以點進去。</p>
</li>
<li><p><a href="https://wiki.owasp.org/?title=Special:Redirect/file/OWASP_Top_10_2017_%E4%B8%AD%E6%96%87%E7%89%88v1.3.pdf">OWASP Top 10 2017 中文版(PDF)</a>- 英文苦手的救星,不過這個是 2017 年的版本哦。</p>
</li>
<li><p>Code Review 的參考指南 - Code Review 到底要看什麼呢?尤其是資安面</p>
<ul>
<li><a href="https://owasp.org/www-pdf-archive/OWASP_Code_Review_Guide_v2.pdf">OWASP Code Review Guide</a></li>
<li><a href="https://google.github.io/eng-practices/review/">Google Code Review Guide</a></li>
</ul>
</li>
</ul>
<figure class="figure">
<p><img src="/posts/2022/08/2022-08-13-book-review-my-second-translated-book-asp-net-core-5-secure-coding-cookbook/image-20220816223225-4sesg5d.png" class="img-fluid" alt="image" title="實體書收到啦" /></p>
<figcaption class="figure-caption">實體書收到啦</figcaption>
</figure>
<p>自從人生的第一本翻譯書弄完之後,我本來想說應該不可能有第二本了。</p>
<p>沒想到,編輯問我說剛好有一本和 ASP.NET Core 以及資安有關的書,看我有沒有興趣。</p>
<p>然後又是一個半年過去,才翻譯完。</p>
<p>作為人生的第二本翻譯書,就要來和大家介紹一下,它是一本什麼內容的書,以及什麼人適合。</p>
https://blog.alantsai.net/posts/2021/12/review-event-stud4-net-conf-2021-taiwan-intro-to-azure-communication-service
[活動] 2021 .NET Conf Taiwan 記錄 - 初探 Azure Communication Service - 讓 App 也有視訊、通話、即時聊天、簡訊和電話功能
2021-12-25T19:00:00Z
<figure class="figure">
<p><img src="/posts/2021/12/2021-12-25-review-event-stud4-net-conf-2021-taiwan-intro-to-azure-communication-service/image-20220328215546-afi2t05.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figcaption class="figure-caption">主題內容</figcaption>
</figure>
<p>這篇的目的是為了記錄準備 2021 .NET Conf Taiwan 活動準備的內容<br />
以及提供一些後面可以參考的資料</p>
<!--more-->
<h2 id="section">為什麼想要做這個主題</h2>
<p>Azure Communication Service (以下簡稱 ACS) 算是是一個比較新的服務,不過真的要說新也不算,因為微軟的 Teams 底層用的就是 ACS,所以有點像是把這個底層服務做成一個 PaaS 服務然後發佈出來讓大家可以使用。</p>
<p>我對於通訊這塊沒有什麼了解,所以感覺要在應用程式裡面做到有視訊、通話或者及時聊天應該沒有這麼容易,不過如果搭配 ACS 可以達到這個效果的話,那感覺會很有趣。</p>
<p>想象一下,當使用者說不清楚他的問題的時候,可以馬上透過 app 聯繫到客服並且可以做桌面分享,對於整個流程應該可以變成非常順暢。</p>
<p>所以,想說研究看看,順便和大家分享研究心得。</p>
<p>實際上,當我自己在研究這個過程,我也發現的確非常的好玩,雖然 demo 沒有做什麼,不過我自己是有點回到以前研究技術的哪種好玩的感覺。</p>
<p>Demo 當然要最後一分鐘做完才有感覺 XD,所以活動前一天還在嘗試 tune 最後的內容,還拍了一張照片做了記錄。</p>
<figure class="figure">
<p><img src="/posts/2021/12/2021-12-25-review-event-stud4-net-conf-2021-taiwan-intro-to-azure-communication-service/image-20220328213250-1cnpgwa.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figcaption class="figure-caption">活動當天早上還在確認 demo 中</figcaption>
</figure>
<h2 id="acs">ACS 到底能夠做到什麼?</h2>
<p>簡單來說,可以讓我們把通訊整合到應用,這個就包括了</p>
<ul>
<li>Video 以及 Video Calling</li>
<li>Chat</li>
<li>Phone (目前只有英國和美國)
<ul>
<li>SMS</li>
<li>接入 PSTN - 實際到自己的電話</li>
</ul>
</li>
</ul>
<p>ACS 不止提供這些服務,還有提供對應的 UI Library,所整合到 Web 應用、Windows 應用以及手機 App 都有可以用的元件。<br />
這個可以大幅度的減少開發的成本。</p>
<p>由於底層的服務和 Teams 用的是一樣,所以其實可以一方用 Teams,一方用 UI Library 來進行溝通。可以想到的情景包括客服使用 Teams,然後客戶用我們提供的應用程式來達到效果。</p>
<p>以下這個滿好的呈現這個效果:</p>
<figure class="figure">
<iframe src="https://www.microsoft.com/en-us/videoplayer/embed/RWGTqQ?postJsllMsg=true" data-src="https://www.microsoft.com/en-us/videoplayer/embed/RWGTqQ?postJsllMsg=true" frameborder="0" allowfullscreen="true" data-linktype="external" title="Video Player" style="width: 566px; height: 322px;"></iframe>
<footer><a href="https://docs.microsoft.com/en-us/azure/communication-services/concepts/teams-interop?WT.mc_id=AZ-MVP-5003856">Teams interoperability</a></footer>
<h2 id="section-1">參考資料</h2>
<p>投影片</p>
<iframe src="https://www.slideshare.net/slideshow/embed_code/key/u4t59fx3wzToYc" data-src="//www.slideshare.net/slideshow/embed_code/key/u4t59fx3wzToYc" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen=""></iframe>
<p>參考連結</p>
<ul>
<li><a href="https://docs.microsoft.com/en-us/azure/communication-services/?WT.mc_id=AZ-MVP-5003856">Overview</a></li>
<li><a href="https://github.com/alantsai-samples/2021-net-conf-acs-demo">Demo Code</a></li>
</ul>
<h2 id="section-2">活動當天</h2>
<p>這次活動是第一次線上+線下,所以相對而言,線下人員比較沒有那麼多。</p>
<p>某種程度來說,也讓一般的接待工作量沒那麼大,所以滿多都是在聊天 XD。</p>
<p>而且這次很多零時補給品:</p>
</figure>
<p><img src="/posts/2021/12/2021-12-25-review-event-stud4-net-conf-2021-taiwan-intro-to-azure-communication-service/image-20220328215430-z8vpgmt.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figure class="figure">
<figcaption class="figure-caption">滿滿補給品</figcaption>
<p>和去年一樣,抽獎程式當場寫:</p>
</figure>
<p><img src="/posts/2021/12/2021-12-25-review-event-stud4-net-conf-2021-taiwan-intro-to-azure-communication-service/image-20220328215507-fhdgi26.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figure class="figure">
<figcaption class="figure-caption">這次操盤手是 koko dada</figcaption>
<p>這次主題早上就結束,沒什麼時間可以在 tune 簡報 XD</p>
</figure>
<p><img src="/posts/2021/12/2021-12-25-review-event-stud4-net-conf-2021-taiwan-intro-to-azure-communication-service/image-20220328215643-qsn40ce.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figure class="figure">
<figcaption class="figure-caption">和活動看板大合照</figcaption>
</figure>
<p><img src="/posts/2021/12/2021-12-25-review-event-stud4-net-conf-2021-taiwan-intro-to-azure-communication-service/image-20220328215915-pq7893l.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figure class="figure">
<figcaption class="figure-caption">忘記拍一張有學員的,只有做綵排準備的照片</figcaption>
</figure>
<p><img src="/posts/2021/12/2021-12-25-review-event-stud4-net-conf-2021-taiwan-intro-to-azure-communication-service/image-20220328215716-57mlgh3.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figure class="figure">
<figcaption class="figure-caption">不免俗,慶功宴大合照</figcaption>
<h2 id="section-3">結語</h2>
<p>ACS 準備找回了久遠的玩 Code 的感覺。</p>
<p>雖然準備卡了滿多地方,以及最後做出來感覺好像沒做什麼 (SDK 都包好了)XD,不過弄出來就是成功啦。</p>
<p>也算圓滿落幕啦。</p>
<p>期待下次和大家分享其他內容</p>
</figure>
<figure class="figure">
<p><img src="/posts/2021/12/2021-12-25-review-event-stud4-net-conf-2021-taiwan-intro-to-azure-communication-service/image-20220328215546-afi2t05.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figcaption class="figure-caption">主題內容</figcaption>
</figure>
<p>這篇的目的是為了記錄準備 2021 .NET Conf Taiwan 活動準備的內容<br />
以及提供一些後面可以參考的資料</p>
https://blog.alantsai.net/posts/2021/09/book-review-my-first-translated-book-hands-on-domain-driven-design-with-dot-net-core
人生的第一本翻譯書:領域驅動設計與 .NET Core:應用 DDD 原則,探索軟體核心複雜度 (Hands-On Domain-Driven Design with .NET Core) | 書評
2021-09-13T19:00:00Z
<section><figure><img class="img-responsive" src="/posts/2021/09/2021-09-13-book-review-my-first-translated-book-hands-on-domain-driven-design-with-dot-net-core/3a5e08f5-42de-4198-800d-9581ceb860f3.jpg" border="0" alt="IMG_20210913_203700.jpg"><br><figcaption>原文和翻譯文</figcaption></figure><p>
認識我的人都知道,其實我中文沒有太好,看我的文章最想做的應該是幫我改錯別字 XD。
</p><p>
不過雖然如此,我還是很喜歡幫忙翻譯。從當初 Visual Studio Code 的首批翻譯人員(滿有趣的是,那時候負責翻譯的人來台灣,和社群朋友聊到,才有人知道我有在做這件事,對方還因此邀請我 MVP Global Summit 可以去吃飯,但是我那時候根本不是微軟 MVP;他預設了是微軟 MVP 才會做這件事),到幫一些 Open Source 軟體提供中文化。
</p><p>
這次有機會翻譯書也是有大大在社群詢問有沒有人有興趣。說實話,當初我根本沒想過我會上,只是想說試試看,也是看看翻譯書有什麼不同,沒想到就上了。
</p><p>
上了只好認真做。我非常怕翻譯不好,不過盡了最大努力,也感謝編輯大大的協助,終於問世啦。現在也可以稱呼我為「譯者」啦 XD。
</p><p>
這篇主要不是在講關於成為譯者(或許未來有機會分享),這篇主要還是和大家介紹一下這本書。
</p></section>
<section>
<a id="KMContentPageTopID" name="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin:0px 0px 0px 20px"><li><a href="#WizKMOutline_1631537048103555" ;="" style="font-size: 15px; line-height: 1.6;">書籍資訊介紹</a><br></li><li><a href="#WizKMOutline_1631537048103373" ;="" style="font-size: 15px; line-height: 1.6;">從理論到實作</a><br></li><li><a href="#WizKMOutline_1631537048103863" ;="" style="font-size: 15px; line-height: 1.6;">到底這本書適不適合我?</a><br></li><li><a href="#WizKMOutline_1631537048103606" ;="" style="font-size: 15px; line-height: 1.6;">相關參考書籍</a><br></li><li><a href="#WizKMOutline_1631537048103697" ;="" style="font-size: 15px; line-height: 1.6;">結語</a><br></li></ul></div>
</section>
<!--more--><section><h2 id="WizKMOutline_1631537048103555">書籍資訊介紹</h2><p>
這本書今天在天瓏上架,可以參考下面的簡單介紹:
</p><div class="bs-callout bs-callout-info"><h4 id="WizKMOutline_1631537048103532">領域驅動設計與 .NET Core:應用 DDD 原則,探索軟體核心複雜度 (Hands-On Domain-Driven Design with .NET Core)</h4><ul><li>適合群眾:任何開發人員對於 DDD 有興趣,尤其是 .NET 開發者</li><li>網址:<a href="https://www.tenlong.com.tw/products/9789864348602">https://www.tenlong.com.tw/products/9789864348602</a></li><li>線上章節:第 13 章是免費章節,可以在博碩文化官網下載:<a href="https://www.drmaster.com.tw/Bookinfo.asp?BookID=MP12034">https://www.drmaster.com.tw/Bookinfo.asp?BookID=MP12034</a></li><li>範例程式碼:<a href="https://github.com/PacktPublishing/Hands-On-Domain-Driven-Design-with-.NET-Core">https://github.com/PacktPublishing/Hands-On-Domain-Driven-Design-with-.NET-Core</a></li></ul></div><p>
下面來看一下簡單的介紹。
</p></section><section><h2 id="WizKMOutline_1631537048103373">從理論到實作</h2><p>
相信大家一開始在開發軟體的時候,都是從以三層式架構(如果不是希望不是更糟糕的,不然要好好反省 XD)然後可能是以資料庫為導向出發,也就是常見的 Repository Pattern 做搭配。
</p><p>
可是,軟體世界變得越來越複雜了,慢慢的,我們從資料庫為導向開始更往程式碼走,這個時候 DDD 反而變得更加的適合。
</p><p>
這本書從為什麼需要 DDD 開始切入。並且說明了 DDD 裡面非常重要的概念「語言和情景」,然後帶著大家從需求開始,以一個刊登廣告的系統作為範例,從 Event Storming 開始介紹起。什麼是 Event Storming,怎麼把一個 Event Storming 主持的好,用它來推到整個產品的設計。
</p><p>
然後開始進入到實作。在這個過程中帶領大家理解,DDD 的重要觀念,例如 Bounded Context、Value Object、Domain Service、Aggreate、Project 等。這其中也有介紹了怎麼和 Repository Pattern 搭配,以及更進入到 CQRS 以及 Event Sourcing。
</p><p>
這本對於 .NET 開發者來說非常適合,是因為它是用 .NET Core 來作為範例,所以會更加了解可以怎麼使用。
</p></section><section><h2 id="WizKMOutline_1631537048103863">到底這本書適不適合我?</h2><p>
我覺的,如果您是工程師,那麼了解 DDD 是避免不了的,尤其是現在開發的軟體越來越複雜的情況下,傳統的三層式架構,然後 Repository 以資料庫為出發的方式會越來越沒辦法應對這個複雜的世界。(這並不是說 Repository Pattern 或者三層式架構不好,只是有些複雜情景可能不適合)。
</p><p>
所以,都要懂 DDD 是什麼,它想要怎麼解決這個問題。
</p><p>
如果已經有一點 DDD 概念的,其實可以直接從範例程式碼來看,看看最後的程式如何,或者從線上免費章節去了解書籍的感覺。
</p><p>
我相信這本書不會讓大家失望,如果有肯定是小弟我學藝不精導致 Orz。
</p></section><section><h2 id="WizKMOutline_1631537048103606">相關參考書籍</h2><p>
講到 DDD 一定繞不過去 DDD 之父的:《領域驅動設計:軟體核心複雜度的解決方法 (Domain-Driven Design: Tackling Complexity in the Heart of Software)》。
</p><p>
這本也是學習 DDD 必備的書籍,所以想要了解更多,可以參考:<a href="https://www.tenlong.com.tw/products/9789864343874">https://www.tenlong.com.tw/products/9789864343874</a></p></section><section><h2 id="WizKMOutline_1631537048103697">結語</h2><p>
這篇只是非常快速的介紹了一下這本書,每一個章節如果拿出來都是可以拆出非常多的內容,或許未來有機會在和大家介紹。
</p>
</section>
<section><figure><img class="img-responsive" src="/posts/2021/09/2021-09-13-book-review-my-first-translated-book-hands-on-domain-driven-design-with-dot-net-core/3a5e08f5-42de-4198-800d-9581ceb860f3.jpg" border="0" alt="IMG_20210913_203700.jpg"><br><figcaption>原文和翻譯文</figcaption></figure><p>
認識我的人都知道,其實我中文沒有太好,看我的文章最想做的應該是幫我改錯別字 XD。
</p><p>
不過雖然如此,我還是很喜歡幫忙翻譯。從當初 Visual Studio Code 的首批翻譯人員(滿有趣的是,那時候負責翻譯的人來台灣,和社群朋友聊到,才有人知道我有在做這件事,對方還因此邀請我 MVP Global Summit 可以去吃飯,但是我那時候根本不是微軟 MVP;他預設了是微軟 MVP 才會做這件事),到幫一些 Open Source 軟體提供中文化。
</p><p>
這次有機會翻譯書也是有大大在社群詢問有沒有人有興趣。說實話,當初我根本沒想過我會上,只是想說試試看,也是看看翻譯書有什麼不同,沒想到就上了。
</p><p>
上了只好認真做。我非常怕翻譯不好,不過盡了最大努力,也感謝編輯大大的協助,終於問世啦。現在也可以稱呼我為「譯者」啦 XD。
</p><p>
這篇主要不是在講關於成為譯者(或許未來有機會分享),這篇主要還是和大家介紹一下這本書。
</p></section>
<section>
<a id="KMContentPageTopID" name="KMContentPageTopID"></a><div id="divKMOutline" style="border-style: groove none; margin: 10px 0px;"><ul style="margin:0px 0px 0px 20px"><li><a href="#WizKMOutline_1631537048103555" ;="" style="font-size: 15px; line-height: 1.6;">書籍資訊介紹</a><br></li><li><a href="#WizKMOutline_1631537048103373" ;="" style="font-size: 15px; line-height: 1.6;">從理論到實作</a><br></li><li><a href="#WizKMOutline_1631537048103863" ;="" style="font-size: 15px; line-height: 1.6;">到底這本書適不適合我?</a><br></li><li><a href="#WizKMOutline_1631537048103606" ;="" style="font-size: 15px; line-height: 1.6;">相關參考書籍</a><br></li><li><a href="#WizKMOutline_1631537048103697" ;="" style="font-size: 15px; line-height: 1.6;">結語</a><br></li></ul></div>
</section>
https://blog.alantsai.net/posts/2021/04/chose-azure-service-04-azure-load-balancer-service
[04] Load Balancer (負載平衡) 相關服務 | [挑選適合的 Azure 服務]
2021-04-22T19:00:00Z
<figure class="figure">
<p><img src="/posts/2021/04/2021-04-22-chose-azure-service-04-azure-load-balancer-service/azure-load-balancer-chose-20220330011403-iw2wopx.jpg" class="img-responsive img-fluid" alt="azure-load-balancer-chose.jpg" /></p>
<figcaption class="figure-caption">Load Balancer 相關服務</figcaption>
</figure>
<p>上雲的其中一個好處是能夠善用它的彈性 (elasticity),也就是當流量變大的時候,要做 scale out 的時候可以很容易做到。</p>
<p>還有另外一個優點是可以善用跨 region 的好處,讓服務可以部署到不同 region,靠近使用著所在的位置,以及提供 High Availability (HA,高可用)</p>
<p>不管是為了 scale,還是速度或者是 HA,這時候 Load Balancer (負載平衡) 就變得很重要。</p>
<p>那挑選什麼 Load Balancer 也變得很重要,這篇來看一下相關可以使用的服務。</p>
<!--more-->
<h2 id="section">選擇負載平衡的選項</h2>
<p>當考慮 Azure Load Balancer 的選項的時候,有兩個點要考慮:</p>
<dl>
<dt>是否需要跨 Region? </dt>
<dd>需要負載平衡的 workload 是在同一個 region 還是在不同 region?<br />
如果跨 region 的話,一般用來建立出高可用的服務,當一個 region 掛了還有另外一個 region 可以使用</dd>
<dt>是不是 HTTP(S) 相關服務</dt>
<dd>要執行的服務是不是走網路第七層的 HTTP(S) 還是走其他的方式?
如果是 HTTP(S) 的話還可以提供其他服務,例如 Web Application Firewall (WAF),也就是可以阻擋常見的攻擊,例如 OWASP Top 10 等。<br />
另外一個針對 HTTP(S) 的優勢是可以針對 url path 去做 route。</dd>
</dl>
<p>如果上面兩個問題可以確定的話,那接下來選擇服務就簡單多了:</p>
<table class="table">
<thead>
<tr>
<th>服務</th>
<th style="text-align: center;">是否跨 Region</th>
<th style="text-align: center;">是否為 HTTP(S)</th>
<th>備註</th>
</tr>
</thead>
<tbody>
<tr>
<td>Azure Load Balancer</td>
<td style="text-align: center;">否</td>
<td style="text-align: center;">否</td>
<td></td>
</tr>
<tr>
<td>Application Gateway</td>
<td style="text-align: center;">否</td>
<td style="text-align: center;">是</td>
<td>支援 WAF</td>
</tr>
<tr>
<td>Traffict Manager</td>
<td style="text-align: center;">是</td>
<td style="text-align: center;">否</td>
<td>走 DNS 類型</td>
</tr>
<tr>
<td>Azure Front Door</td>
<td style="text-align: center;">是</td>
<td style="text-align: center;">是</td>
<td>支援 WAF</td>
</tr>
</tbody>
</table>
<p>依照這個概念其實挑選適合的 Load Balancer 就非常容易了,一樣微軟也有做一個判斷表可以用來參考:</p>
<figure class="figure">
<p><img src="/posts/2021/04/2021-04-22-chose-azure-service-04-azure-load-balancer-service/image-20220330010138-yx5k244.png" class="img-responsive img-fluid" alt="image.png" /></p>
<figcaption class="figure-caption">應該使用那個 Load Balancer。來源:<a href="https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/load-balancing-overview">https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/load-balancing-overview</a></figcaption>
</figure>
<h2 id="section-1">結語</h2>
<p>在沒有認真了解 Load Balancer 服務之前可能會很難選擇適合的服務。</p>
<p>不過,當把重要的兩個因素抓出來之後,依照情景來選擇就不困難了。</p>
<p>當然,還有很多細節要注意,不過就可以針對性的去在做了解就可以。</p>
<h2 id="section-2">參考資料</h2>
<ul>
<li><a href="https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/load-balancing-overview?WT.mc_id=AZ-MVP-5003856">Load-balancing options</a></li>
</ul>
<figure class="figure">
<p><img src="/posts/2021/04/2021-04-22-chose-azure-service-04-azure-load-balancer-service/azure-load-balancer-chose-20220330011403-iw2wopx.jpg" class="img-responsive img-fluid" alt="azure-load-balancer-chose.jpg" /></p>
<figcaption class="figure-caption">Load Balancer 相關服務</figcaption>
</figure>
<p>上雲的其中一個好處是能夠善用它的彈性 (elasticity),也就是當流量變大的時候,要做 scale out 的時候可以很容易做到。</p>
<p>還有另外一個優點是可以善用跨 region 的好處,讓服務可以部署到不同 region,靠近使用著所在的位置,以及提供 High Availability (HA,高可用)</p>
<p>不管是為了 scale,還是速度或者是 HA,這時候 Load Balancer (負載平衡) 就變得很重要。</p>
<p>那挑選什麼 Load Balancer 也變得很重要,這篇來看一下相關可以使用的服務。</p>
https://blog.alantsai.net/posts/2021/03/chose-azure-service-03-azure-compute-related-service
[03] 運算相關服務 | [挑選適合的 Azure 服務]
2021-03-02T19:00:00Z
<figure class="figure">
<p><img src="/posts/2021/03/2021-03-02-chose-azure-service-03-azure-compute-related-service/20220329233317-l5g14h6.jpg" class="img-responsive img-fluid" alt="03 運算相關服務.jpg" /></p>
<figcaption class="figure-caption">Azure 運算相關服務</figcaption>
</figure>
<p>當思考假設任何應用程式的時候,第一個要思考的肯定是運算相關的服務。<br />
也就是要使用什麼方式來執行應用程式。</p>
<p>這個時候取決於幾個不同的考量點,可能會使用不同的服務。</p>
<p>這篇,來看一下,那些需要思考的點,以及可以參考的地方。</p>
<!--more-->
<h2 id="section">選擇運算服務的決策樹</h2>
<p>我們可以先來看一下微軟所提供的的提供給我們判斷的決策樹:</p>
<figure class="figure">
<p><img src="/posts/2021/03/2021-03-02-chose-azure-service-03-azure-compute-related-service/image-20220329213851-82vgpkb.png" class="img-responsive img-fluid" alt="image.png" /></p>
<figcaption class="figure-caption">微軟提供的和運算相關的決策樹:<a href="https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/compute-decision-tree?WT.mc_id=AZ-MVP-5003856">https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/compute-decision-tree</a></figcaption>
</figure>
<p>這個樹其實非常完整的涵蓋了幾種不同的情景。<br />
我們可以針對幾個情景做一點說明:</p>
<ul>
<li>要用 IaaS 還是 PaaS?</li>
<li>要用 Container 嗎?</li>
<li>事件類型的運算嗎?</li>
<li>批次類型的處理嗎?</li>
</ul>
<h2 id="iaas-paas">要用 IaaS 還是 PaaS?</h2>
<p>IaaS 以及 PaaS 的差異相信不需要贅述。</p>
<p>IaaS 不用說,基本上只有 Virtual Machine 可以選擇。如果需要可以做 Scale out,那麼就可以考慮 Virtual Machine Scale Set。<br />
所以,如果需要能夠完整掌控機器的話,那就只能夠考慮 IaaS。</p>
<p>至於 PaaS 的話,基本上剩下的服務大部分都屬於 PaaS。<br />
取決於執行的服務類型,如果是 Web 相關應用,那麼以 App Service 為主。<br />
其他類型則可以參考下面。</p>
<h2 id="container">要用 Container 嗎?</h2>
<p>Container 的好處相信這幾年大家也有非常多的了解。</p>
<p>因此把服務打包成為 Container 已經變成了一個很常見的情景。</p>
<p>如果今天要執行的是 Container 相關,那有以下幾個可以做參考:</p>
<dl>
<dt>Azure App Service </dt>
<dd>app service 也可以執行 Container。<br />
如果說是一個不需要 Orchestrator 的情況下,並且是一個需要<mark>持續執行</mark>的服務,那麼 app service 滿適合。</dd>
<dt>Azure Container Instance (ACI) </dt>
<dd>如果今天執行的是類似於<mark>一下開一下關</mark>的情況,並且也不需要 Orchestrator,那麼這個服務很適合。</dd>
<dt>Azure Kubernetes Service (AKS) </dt>
<dd>不用說,如果需要 Orchestrator 的話,那麼 K8S 已經是標準。因此使用它的 PaaS 服務 AKS 很適合。</dd>
</dl>
<h2 id="section-1">事件類型的運算嗎?</h2>
<p>這邊提到的事件 (Event) 主要是針對某個事情發生的時候要觸發並且要執行某些程式的情況下很適合。</p>
<p>舉例來說,為了可以避免元件之間的耦合度,一般都會考慮墊一層 queue。<br />
那這個時候,queue 加了一筆資料的時候,會希望觸發對應的事情進行處理,就是我們這邊提到的事件。</p>
<p>這個時候,Azure Function 就非常適合。因為 Azure Function 可以透過 Binding 的概念,只需要設定一下,然後就可以把資料透過 parameter 的方式把資料直接拿到,不需要花其他工在和服務之間進行溝通,而只需要 focus 在處理這段資料的邏輯上面就好。</p>
<p>更多資料可以參考:</p>
<ul>
<li><a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings?tabs=csharp&WT.mc_id=AZ-MVP-5003856">Azure Functions triggers and bindings concepts</a></li>
</ul>
<h2 id="section-2">批次類型的處理嗎?</h2>
<p>如果今天要執行的是 High Performance Compute (HPC) 或者是一些需要大量運算的話,那麼可以考慮使用 Azure Batch。</p>
<p>範例可能是做像是媒體轉碼,或者是 ETL 作業。</p>
<figure class="figure">
<p><img src="/posts/2021/03/2021-03-02-chose-azure-service-03-azure-compute-related-service/image-20220329231407-9pbpct3.png" class="img-responsive img-fluid" alt="image.png" /></p>
<figcaption class="figure-caption">運作方式。來源:<a href="https://docs.microsoft.com/en-us/azure/batch/batch-technical-overview?WT.mc_id=AZ-MVP-5003856">https://docs.microsoft.com/en-us/azure/batch/batch-technical-overview</a></figcaption>
</figure>
<p>Azure Batch 簡單來說可以分成兩個部分:</p>
<ol>
<li>把需要執行的東西放在 Azure Storage</li>
<li>實際執行的作業是透過 Job 以及裡面的 Pool 最後結果回傳到 Storage</li>
</ol>
<h2 id="section-3">結語</h2>
<p>這篇簡單的使用了微軟提供的判斷樹來說明幾個常見的運算相關服務。<br />
希望透過這篇在挑選不同的運算服務的時候,有個比較清晰的概念。</p>
<figure class="figure">
<p><img src="/posts/2021/03/2021-03-02-chose-azure-service-03-azure-compute-related-service/20220329233317-l5g14h6.jpg" class="img-responsive img-fluid" alt="03 運算相關服務.jpg" /></p>
<figcaption class="figure-caption">Azure 運算相關服務</figcaption>
</figure>
<p>當思考假設任何應用程式的時候,第一個要思考的肯定是運算相關的服務。<br />
也就是要使用什麼方式來執行應用程式。</p>
<p>這個時候取決於幾個不同的考量點,可能會使用不同的服務。</p>
<p>這篇,來看一下,那些需要思考的點,以及可以參考的地方。</p>
https://blog.alantsai.net/posts/2021/02/chose-azure-service-02-use-azure-charts-to-find-learning-materials-sla-customer-stories-about-azure-services
[02] 查找 Azure 服務資訊的網站 - 包含客戶案例、學習資源以及架構圖等 | [挑選適合的 Azure 服務]
2021-02-11T19:00:00Z
<figure class="figure">
<p><img src="/posts/2021/02/2021-02-11-chose-azure-service-02-use-azure-charts-to-find-learning-materials-sla-customer-stories-about-azure-services/20220329204129-go29kdd.jpg" class="img-responsive img-fluid" alt="02 查找 Azure 服務資訊的網站 - 包含客戶案例、學習資源以及架構圖等.jpg" /></p>
<figcaption class="figure-caption">查找 Azure 服務資訊的網站</figcaption>
</figure>
<p>有時候自己已經聽過或者知道某個服務,但是想要找一些參考資料做學習或者看相關的架構文件,有時候沒有那麼容易可以找到。</p>
<p>在這篇將會介紹一個網站叫做:<a href="https://azurecharts.com/">Azure Charts</a>,這個網站可以讓我以服務的角度快速找到相關資訊。</p>
<p>來看看能夠做到什麼。</p>
<!--more-->
<h2 id="azure-charts">Azure Charts 能夠做到什麼?</h2>
<p>Azure Charts (<a href="https://azurecharts.com/">https://azurecharts.com/</a>) 是一個免費的服務,裡面匯集了以服務的角度的一個 360° 的視角。</p>
<p>因此,透過這個網站可以快速找到一些關於某個服務的參考資料。</p>
<p>這邊將針對幾個部分介紹:</p>
<ul>
<li>某個服務的 360°視角</li>
<li>查詢架構圖</li>
<li>查詢客戶成功案例</li>
<li>查詢學習資源</li>
<li>查詢 SLA</li>
</ul>
<h2 id="section">某個服務的 360°視角</h2>
<p>可以進入 Azure Charts 的 Overview 功能 (<a href="https://azurecharts.com/overview">https://azurecharts.com/overview</a>),會看到以下畫面:</p>
<figure class="figure">
<p><img src="/posts/2021/02/2021-02-11-chose-azure-service-02-use-azure-charts-to-find-learning-materials-sla-customer-stories-about-azure-services/image-20220329201815-qi7s85k.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figcaption class="figure-caption">Overview 畫面</figcaption>
</figure>
<p>這邊可以看到:</p>
<ul>
<li>欄位是用分類來區分 - 所以今天如果看運算相關,看 Compute 那欄就好</li>
<li>右邊 <code>All Services</code> 的下拉可以用來挑選,例如只要看 IaaS 相關就好,還是只看 PaaS 就好</li>
</ul>
<p>透過這個方式,可以快速找出有興趣的服務,然後可以在點進去看:</p>
<figure class="figure">
<p><img src="/posts/2021/02/2021-02-11-chose-azure-service-02-use-azure-charts-to-find-learning-materials-sla-customer-stories-about-azure-services/image-20220329201909-on18omq.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figcaption class="figure-caption">Azure Virtual Machine 的 360° 視角</figcaption>
</figure>
<p>在這邊就可以看到 (從左邊數過來):</p>
<ol>
<li>最近更新內容</li>
<li>在那些 Region 有支援這個服務</li>
<li>有沒有預期的更新</li>
<li>相關的架構</li>
<li>相關的客戶成功案例</li>
<li>相關的 Microsoft Learn 學習資源</li>
</ol>
<p>接下來我們針對幾個常見的部分做介紹。</p>
<h2 id="section-1">查詢架構圖</h2>
<p>我們可以從 360° 視角的 <code>Ref. architectures</code> 進入,或者上面 Menu 的 <code>Solutions -> Solutions Explorer</code> 看到。</p>
<p>點下去之後,我們可以看到:</p>
<figure class="figure">
<p><img src="/posts/2021/02/2021-02-11-chose-azure-service-02-use-azure-charts-to-find-learning-materials-sla-customer-stories-about-azure-services/image-20220329202414-nhnr562.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figcaption class="figure-caption">Solution Explorer 畫面</figcaption>
</figure>
<ol>
<li>下拉選單呈現的是和這個資源有關的架構圖</li>
<li>可以在選擇更多的服務:下拉呈現的內容是所有選取的服務有出現的架構圖才會出現。因此,假設想要看 Virtual Machine 和 Key Vault 相關的架構圖有那些,就可以選擇這兩個服務</li>
</ol>
<h2 id="section-2">查詢客戶成功案例</h2>
<p>運作方式其實和架構圖的部分是一樣的。</p>
<p>在這邊列出的東西就會是和有選取的服務相關的客戶成功案例。</p>
<p>可以看到下拉還會幫忙區分出不同的產業:</p>
<figure class="figure">
<p><img src="/posts/2021/02/2021-02-11-chose-azure-service-02-use-azure-charts-to-find-learning-materials-sla-customer-stories-about-azure-services/image-20220329202754-7zhiio3.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figcaption class="figure-caption">客戶成功案例畫面</figcaption>
</figure>
<h2 id="section-3">查詢學習資源</h2>
<p>這個是我覺的最好用的部分。</p>
<p>當看到某個服務想要知道有什麼學習資源,透過上面 Menu 的 <code>Learning</code> 或者透過 360° 進入都是一樣概念。</p>
<p>這邊下拉可以列出對應的:</p>
<ul>
<li>Microsoft Learn Modules</li>
<li>Microsoft Learn Learning Path</li>
<li>相關證照</li>
<li>相關考試</li>
</ul>
<figure class="figure">
<p><img src="/posts/2021/02/2021-02-11-chose-azure-service-02-use-azure-charts-to-find-learning-materials-sla-customer-stories-about-azure-services/image-20220329203031-jot1ylj.jpg" class="img-responsive img-fluid" alt="image.jpg" />^^^學習相關畫面</p>
<h2 id="sla">查詢 SLA</h2>
<p>當要使用某個服務的時候,最重要當然是 SLA 提供到什麼程度。</p>
<p>所以,可以透過 Menu 的 <code>SLA</code> 選線,進入到的畫面將會列出可以達到的最高 SLA 是什麼:</p>
</figure>
<p><img src="/posts/2021/02/2021-02-11-chose-azure-service-02-use-azure-charts-to-find-learning-materials-sla-customer-stories-about-azure-services/image-20220329203241-onmz3ki.jpg" class="img-responsive img-fluid" alt="image.jpg" /></p>
<figure class="figure">
<figcaption class="figure-caption">SLA 畫面</figcaption>
<p>如果想看到細節,滑動到某個服務之後,點下去會自動帶到官方文件的部分。<br />
就可以去參考更多資訊。</p>
<h2 id="section-4">結語</h2>
<p>這個網站對於想要了解 Azure 服務有非常大的幫助。</p>
<p>上面還有不同的有趣資訊,篇幅關係就沒有都介紹,但是大家可以自己去嘗試看看。</p>
</figure>
<figure class="figure">
<p><img src="/posts/2021/02/2021-02-11-chose-azure-service-02-use-azure-charts-to-find-learning-materials-sla-customer-stories-about-azure-services/20220329204129-go29kdd.jpg" class="img-responsive img-fluid" alt="02 查找 Azure 服務資訊的網站 - 包含客戶案例、學習資源以及架構圖等.jpg" /></p>
<figcaption class="figure-caption">查找 Azure 服務資訊的網站</figcaption>
</figure>
<p>有時候自己已經聽過或者知道某個服務,但是想要找一些參考資料做學習或者看相關的架構文件,有時候沒有那麼容易可以找到。</p>
<p>在這篇將會介紹一個網站叫做:<a href="https://azurecharts.com/">Azure Charts</a>,這個網站可以讓我以服務的角度快速找到相關資訊。</p>
<p>來看看能夠做到什麼。</p>