Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 記錄軟體開發的點點滴滴 著重於微軟技術、網頁開發、DevOps、C#, Asp .net Mvc、Azure、AI、Chatbot、Docker、Data Science

[faq]Azure DevOps如何透過設定Service Connection連到非同帳號的Azure 訂閲 - GUI篇

Azure DevOps如何透過設定Service Connection連到非同帳號的Azure 訂閲 - GUI篇.jpg
圖片來源:https://pixabay.com/en/key-tag-security-label-symbol-2114047/

Azure DevOps裡面的Pipeline功能讓做軟體開發裡面的CI (Continuous Integration) 以及CD (Continuous Develiery) 非常的容易。

其中,在CD的時候把結果部署到Azure上面是很常見的一個需求。

在Azure DevOps裡面設定可以部署到那個Azure訂閲裡面是透過設定Service Connection,如果目前登入到Azure DevOps的帳號有權限操作Azure訂閲,那麽設定Service Connection非常的容易。

但是如果沒有呢?畢竟管理Azure DevOps和管理Azure很有可能是兩個不同的帳號。

這個時候怎麽辦呢?

這篇來看看如何透過在Azure建立App以及Service Principal,然後在Azure DevOps使用這些資訊建立出Service Connection能夠CD部署到Azure上面。

問題描述

首先,先來看一下Azure DevOps裡面會設定Service Connection的地方。

假設今天想要部署結果到Azure Web App,從Azure DevOps Piepline裡面的Release可以建立出一個task。

這個時候設定Azure Subscription欄位,可以直接用下拉選單列出目前總共有那些可以用的Azure Service Conenction:

chrome_2019-07-09_20-46-16.png
可以選擇的Azure訂閲

可以看到,如果目前登入Azure DevOps的帳號有Azure訂閲,會自動列出來,這個時候直接選擇就可以使用了。

可是如果今天這個帳號沒有Azure訂閲呢?

解決方式

要解決這個問題,大概分兩個部分:

  1. 先用有Azure權限的帳號登入建立出Service Principal並且設定允許的權限
  2. 到Azure DevOps用剛剛建立出來的Service Principal建立出Service Connection

換句話説,用有權限的帳號在Azure先建立一個代表權限的app (或者叫做Service Principal),在Azure DevOps用那個app作爲連線的帳號建立出Service Connection。

在Azure建立Service Principal

首先,接下來操作Azure的帳號必須有權限在Azure Active Directory裡面建立App Registration。

如果說使用的帳號在AAD裡面是一般user,那麽記得在Azure的User Setting (傳送門) App Registration要開啓

chrome_2019-07-09_20-59-46.png
允許一般user建立app
進入到App Registration畫面

從AAD的 App Registration -> New Registration進入

也可以透過傳送門直接開啓。

chrome_2019-07-09_21-01-19.png
進入App Registration畫面
輸入App的Name以及Account Type
Name好識別就可以,Account Type選擇第一個即可,然後按下Register
chrome_2019-07-09_21-03-45.png
設定app
取得 Application Id 以及 Directory (tenant) Id

當app建立好了之後,會自動導向建立出來的app頁面,這個時候可以取得等一下需要的兩個id:

  1. app id
  2. tenant id

chrome_2019-07-09_21-06-55.png
取得兩個重要的id
取得password

接下來要建立一個密碼,也是稍後設定會用到:

  1. 選擇左邊的 Certificate & secrets
  2. 卷下來選擇 New Client Secret
  3. 輸入這一組密碼的名稱
  4. 設定多久到期
  5. 按下 add
chrome_2019-07-09_21-07-59.png
加入password

稍等一下,會在清單裡面看到多了一筆密碼,記得要複製看到的密碼。

這個密碼只會呈現這一次,換句話説如果沒有複製下來的話,那麽只能重新在產生一個。

chrome_2019-07-09_21-10-18.png
複製產生出來的密碼
進入到Subscription取得Subscription Id以及Name

切換到訂閲(Subscription)清單(傳送門),選擇會被部署的那個訂閲

取得Overview看到的Id以及Name:

chrome_2019-07-09_21-31-08.png
取得訂閲Id以及Name

設定剛剛的App為訂閲的owner

最後一步要設定剛剛的那個app在訂閲的權限為owner。

  1. 在左邊選擇 Access Control (IAM)
  2. 選擇 Add -> Add Role Assignments
  3. Role選擇 Owner
  4. 搜索剛剛建立的app名字
  5. 從清單選擇最後要加入的帳號
  6. 確認之後按下Save
chrome_2019-07-09_21-19-31.png
設定app權限

到這邊Azure Service Principal就建立好啦 - 接下來就是回Azure DevOps看看怎麽連在一起。

在Azure DevOps設定Service Connection

接下來操作都是在Azure DevOps - 首先先開啓之前設定Azure Subscription的畫面。

進入Service Connection的設定畫面

點選 Azure Subscription旁邊的Manange連接

chrome_2019-07-09_21-24-05.png
Manage連接
選擇建立Azure Resource Manager
chrome_2019-07-09_21-25-48.png
建立Azure Resource Manager
切換到full version的畫面
在跳出來的視窗拉到下面,點選連接use the full version of the service connection dialog.
chrome_2019-07-09_21-27-57.png
開啓完整設定模式
依序輸入從Azure那邊得到的訊息
  1. Connection Name設定好識別即可 - 在Azure DevOps選單出現的名字
  2. Subscription Id - 上面取得的訂閲Id
  3. Subscription Name - 上面取得的訂閲名稱
  4. Service Principle Client Id - 建立Application得到的Application Id
  5. Service principal key - 在Application設定password得到的那一串
  6. Teant Id - 在Application Overview裡面看到的 Directory (Teanat) Id
  7. 驗證是否有輸入錯 - 如果都okay應該會出現 Verified
  8. 按下 Ok 即可
chrome_2019-07-09_21-32-57.png
設定好Service Connection

到這邊Azure DevOps的Service Connection就設定好了,只需要回到剛剛選擇Subscription的下拉就可以選擇到了:

  1. 如果下來沒有出現,可以點選旁邊的按鈕來reload
  2. 可以選擇到剛剛建立的connection
chrome_2019-07-09_21-36-07.png
設定成功,可以選擇到了

結語

透過這篇,相信如果管理Azure DevOps以及Azure是兩個帳號要設定部署也沒有什麽問題。

不過上面的操作有點繁瑣,尤其是微軟其實會不定期的更新Azure,所以截圖的内容很有可能幾年或者幾個月之後又改版又要去瞭解如何拿到這些訊息。

有沒有更無腦的設定方式呢?

下篇([faq]Azure DevOps如何透過設定Service Connection連到非同帳號的Azure 訂閲 - powershell篇)來介紹如何透過Powershell指令快速建立。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus