Azure cliの方法はこちら
Azure Powershellで非対話型でログインする方法。これ、だいぶ頭を使った。
Azure Powershellで、Connect-AzAccountでログインをすると以下のようなメッセージが出る。Mac/LinuxだとそのURLとコードを入れて、自分のMSアカウント選択してログイン。
WARNING: To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code ABCDEFGH to authenticate.
なんか、正直たるい。まぁ、どこかのWEBブラウザを開く必要があるし。。。自動化するのも難しい。
コマンドラインだけでログインできないのか?
できた。。。
まず、その前にService Principalというのを理解する必要がある。
Azure PortalにログインをするのにMSアカウントでログインができるが、自動化する場合は、Azure ADに登録された「Application」というものでログインをする。
その「Application」は、ロールを持っていて、Tenant ID、Application IDでクレデンシャルを認識する。
簡単に「Application」の作り方を説明すると、
Azure Portalを開き
Azure AD -> Add Applicationを開き、New registrationをクリック
名前とアカウントタイプとRedirct URIを指定。URIは、http://localhost以外は証明書がいる。
認証の作成をする。証明書とSecretが利用できるが、Secretを使うためにNew Client secretをクリック
Descriptionと期限を入力
ValueにSecretが表示される。この時メモしないと2度と再表示ができないので注意
ロールの作成
Subscrtiption -> IAM –> Add role assigmentをクリック
ロールとApplicationとの紐付け
これで「Application」は作成できる。
名前は識別名で実際は、Tenant ID、Application IDが重要。Application IDがユーザ名に相当する。
閑話休題
実際にコマンドラインだけでログインをする方法を記載する
手順は
1. アプリケーションの作成(初回だけ)
2. ロールの割当(初回だけ)
3. ログイン
となる。
1. アプリケーションの作成(初回だけ)
https://docs.microsoft.com/ja-jp/powershell/azure/create-azure-service-principal-azureps?view=azps-3.8.0
アプリケーション名は、Azure_my_login、パスワードはPassword1234Password1234で作成する。有効期限は2024年まで。パスワードと有効期限を細かく指定できるのはPowerShellだけ。
PS /home/tmase> Import-Module Az.Resources
PS /home/tmase> $credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password=”Password1234Password1234“}
PS /home/tmase> $sp = New-AzAdServicePrincipal -DisplayName Azure_my_login -PasswordCredential $credentials
PS /home/tmase> Write-Output $sp
ServicePrincipalNames : {11111111-2222-3333-4444-555555555555, http://Azure_my_login}
ApplicationId : 11111111-2222-3333-4444-555555555555
ObjectType : ServicePrincipal
DisplayName : Azure_my_login
Id : 66666666-7777-8888-9999-AAAAAAAAAAAA
Type :
2. ロールの割当(初回だけ)
この例はContributorで記載しているので注意!
PS /home/tmase> New-AzRoleAssignment -ApplicationId 11111111-2222-3333-4444-555555555555 -RoleDefinitionName “Contributor“
RoleAssignmentId : /subscriptions/XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB/providers/Microsoft.Authorization/roleAssignments/SSSSSSSS-TTTT-UUUU-PPPPPPPPPPPP
Scope : /subscriptions/XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB
DisplayName : Azure_my_login
SignInName :
RoleDefinitionName : Contributor
RoleDefinitionId : b24988ac-6180-42a0-ab88-20f7382dd24c
ObjectId : 66666666-7777-8888-9999-AAAAAAAAAAAA
ObjectType : ServicePrincipal
CanDelegate : False
<参考>作成したApplication
PS /home/tmase> Get-AzADApplication -DisplayName Azure_my_login
DisplayName : Azure_my_login
ObjectId : oooooooo-bbbb-jjjj-eeee-cccccccccccc
IdentifierUris : {http://Azure_my_login}
HomePage : http://Azure_my_login
Type :
ApplicationId : 11111111-2222-3333-4444-555555555555
AvailableToOtherTenants : False
AppPermissions :
ReplyUrls : {}
ObjectType : Application
3. ログイン
https://docs.microsoft.com/ja-jp/powershell/azure/authenticate-azureps?view=azps-3.8.0#code-try-2
Tenant IDを事前に確認しておく。(TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT)
Tenant IDを変数に入れておく
PS /home/tmase> $tenantId=TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT
PS /home/tmase> Write-Output $tenantId
TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT
テスト
ApplicationIDが11111111-2222-3333-4444-555555555555、パスワードがPassword1234Password1234の場合
PS /home/tmase> $pscredential = Get-Credential
PowerShell credential request
Enter your credentials.
User: 11111111-2222-3333-4444-555555555555
Password for user 11111111-2222-3333-4444-555555555555: ********************** (Password1234Password1234)
PS /home/tmase> $tenantId=(Get-AzContext).Tenant.Id
PS /home/tmase> Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId
WARNING: The provided service principal secret will be included in the ‘AzureRmContext.json’ file found in the user profile ( /home/tmase/.Azure ). Please ensure that this directory has appropriate protections.
Account SubscriptionName TenantId Environment
——- —————- ——– ———–
11111111-2222-3333-4444-555555555555 従量課金 TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT AzureCloud
〜/.Azure/AzureRmContext.jsonにパスワードやSecretが入っているので注意
テキストに埋め込む場合
TenantIDがTTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT、ApplicationIDが11111111-2222-3333-4444-555555555555、パスワードがPassword1234Password1234の場合
$tenantId=TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT
$passwd = ConvertTo-SecureString “Password1234Password1234” -AsPlainText -Force
$pscredential = New-Object System.Management.Automation.PSCredential(‘11111111-2222-3333-4444-555555555555/id’, $passwd)
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId
この設定を行った端末は、以後Connect-AzAccountをしなくても利用できる。また、axure cliでもaz loginをしなくても接続ができる。