/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

vagrant-azureを使ってAzureに仮想マシンを建ててみたメモ

自宅開発環境が貧弱で大変厳しいので、コーディング環境含めクラウド上で行えるようにできないかと色々試しています。 とりあえず最低限SSH使える環境がアレばスマフォでもコーディングとビルドが行える環境を作るのが目標です。

クラウドは使っている間だけ課金されるので、使うときにマシンを建てて終わったら即潰す運用をすると安く済みそうです。 潰し忘れを防ぐため、インスタンスの立ち上げも落とすのもすべて自動でやりたいです。

今回はその第一歩として、READMEを読みながらVagrantを使ってMicrosoft Azure上に仮想マシンを建ててみました。

必要アプリのインストール

Vagrant, Azure-cli, vagrant-azure pluginとdotenvをインストールする必要があります。

Vagrant

やるだけ

Azure-cli

Azure-cliのインストール方法はgithubのREADMEを参照して行うだけです。

github.com

curl -L https://aka.ms/InstallAzureCli | bash

インストールはデフォルトだと ~/ 以下になります。 変えたいときはインストール時にパスを入力すると、その下においてくれます。

===> In what directory would you like to place the install? (leave blank to use '/home/tnishinaga/lib/azure-cli'): ~/opt/azure/lib/azure-cli
-- We will install at '/home/tnishinaga/opt/azure/lib/azure-cli'.             
===> In what directory would you like to place the 'az' executable? (leave blank to use '/home/tnishinaga/bin'): ~/opt/azure/bin

vagrant-azure

vagrant-azureプラグインも入れるだけ……なのですが、私の環境ではエラーが起きたので頑張ってインストールしました。 同じ問題が起きた方は参考にしてください。

tnishinaga.hatenablog.com

dotenv

dotenvをインストールすると.envに書いてある設定をVagrant内で読み込むことができるようになります。 この.envにアクセスキー等を書いておいて、.gitignoreに登録しておけばアクセスキーなどのネットに上がっては困る情報を間違えてネットにあげてしまうリスクを下げることができるようです。

vagrant-azureのREADMEにはインストールするよう書いてありませんが、サンプルで使ってるのでインストールします。

vagrant plugin install dotenv

vagrant-azureで仮想マシンを建ててみる

基本はvagrant-azureのREADMEにあるGetting Startedの手順をなぞるだけです。

github.com

初期設定

Azureへのログイン

az login でAzureにログインします。

あるURLにアクセスしてこのコードを入力してくださいと言われるので、そのとおりにします。

Azure Active Directory Applicationを作る

az ad sp create-for-rbac コマンドでAzure Active Directory Applicationというものを作ります。 以下のようなメッセージが出てくるはずなので、tenant, appId, passwordをメモっておいてください。

{
  "appId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "displayName": "some-display-name",
  "name": "http://azure-cli-2017-04-03-15-30-52",
  "password": "XXXXXXXXXXXXXXXXXXXX",
  "tenant": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

サブスクリプションIDの取得

サブスクリプションIDも必要なので az account list --query "[?isDefault].id" -o tsv で取得してメモしておきます。

Vagrantfileの作成

以下のようなVagrantfileを作ります。

require 'dotenv'
Dotenv.load

Vagrant.configure('2') do |config|
  config.vm.box = 'azure'

  # use local ssh key to connect to remote vagrant box
  config.ssh.private_key_path = '~/.ssh/id_rsa'
  config.vm.provider :azure do |azure, override|

    # each of the below values will default to use the env vars named as below if not specified explicitly
    azure.tenant_id = ENV['AZURE_TENANT_ID']
    azure.client_id = ENV['AZURE_CLIENT_ID']
    azure.client_secret = ENV['AZURE_CLIENT_SECRET']
    azure.subscription_id = ENV['AZURE_SUBSCRIPTION_ID']
  end

end

vagrant-azureのREADMEとの差異として、以下を先頭に追記しています。

require 'dotenv'
Dotenv.load

これは、AZURE_TENANT_IDなどの値を.envから引いてくるために使われるdotenvプラグインを読みこむために必要です。

.envファイルを作る

.envファイルを作り、先程メモしたtenant, appId, password、サブスクリプションIDをここに入力します。

AZURE_TENANT_ID=tenant
AZURE_CLIENT_ID=appId
AZURE_CLIENT_SECRET=password
AZURE_SUBSCRIPTION_ID=サブスクリプションID

この.envファイルはgithub等にあげてしまうと悪用されてしまうので、.gitignoreに追加して公開されないようにしておきます。

echo ".env" >> .gitignore

ssh-keyを作っていない方は、ssh-keygenでid_rsaとid_rsa.pubの鍵ペアを作って置く必要もあります。

仮想マシンを起動してみる

vagrant box add azure https://github.com/azure/vagrant-azure/raw/v2.0/dummy.box --provider azure

したあと

vagrant up --provider=azure

仮想マシンがAzureで立ち上がるはずです。

立ち上がった後は、 vagrant sshSSHアクセスができます。

ロケーションのエラーが出た場合

私の使ってるサブスクリプションの問題で、エラーがでて起動できないことがありました。

  "response": {                                                                                                                                                                                                                                    
    "body": "{\"status\":\"Failed\",\"error\":{\"code\":\"DeploymentFailed\",\"message\":\"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/arm-debug for usage details.
\",\"details\":[{\"code\":\"Conflict\",\"message\":\"{\\r\\n  \\\"error\\\": {\\r\\n    \\\"code\\\": \\\"SkuNotAvailable\\\",\\r\\n    \\\"message\\\": \\\"The requested tier for resource '/subscriptions/6af6c932-69d5-441b-9ed1-fbd7a6dc4e09/r
esourceGroups/polished-voice-4/providers/Microsoft.Compute/virtualMachines/fragrant-sun-83' is currently not available in location 'westus' for subscription '6af6c932-69d5-441b-9ed1-fbd7a6dc4e09'. Please try another tier or deploy to a differe

ログを見る限りでは、デフォルトで選択されるwestusロケーションが使えなかったようです。

これはlocationの設定を変更すると回避できるそうなので、とりあえず色々試して東南アジア(southeastasia)を選択しました。

ロケーション選択追記後のVagrantfileは以下のようになります。

require 'dotenv'
Dotenv.load

Vagrant.configure('2') do |config|
  config.vm.box = 'azure'

  # use local ssh key to connect to remote vagrant box
  config.ssh.private_key_path = '~/.ssh/id_rsa'
  config.vm.provider :azure do |azure, override|

    # each of the below values will default to use the env vars named as below if not specified explicitly
    azure.tenant_id = ENV['AZURE_TENANT_ID']
    azure.client_id = ENV['AZURE_CLIENT_ID']
    azure.client_secret = ENV['AZURE_CLIENT_SECRET']
    azure.subscription_id = ENV['AZURE_SUBSCRIPTION_ID']
    azure.location = "southeastasia"
  end

end

仮想マシンを潰す

使い終わったら、vagrant destroy でマシンを潰せます。

おしまい

とりあえずこれで仮想マシンの立ち上げと削除ができることが確認できました。

次はansibleを用いて環境の自動設定をやってみようと思います。