Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

今年もお世話になりました。

こんにちは!今年も恒例のアドベントカレンダーの季節がやってきました。

adventar.org

今日はエンジニア転職2年目最後の月を迎えております オルターブース かどた がお送りします! 今年を振り返ってみると本当に色々な経験をさせて頂き、本当に多くの方々にお世話になった一年だったなぁと感じています。
エンジニアとしてまだまだ未熟者ではありますが、いろんな方に支えられサポートして頂き、日々充実した毎日を送れていることに感謝しております。
なかでも今年11月にサンフランシスコで開催された GitHub Universe 2023 に現地参加させて頂いたのは、人生の中でもなかなかのビッグイベントとなりました!
現地でもたくさんブログを書きましたので是非ご覧ください。

aadojo.alterbooth.com

そして先週末には新入社員企画の 忘年会も盛大に開催され、年末に向けて駆け足で物事が進んでいっている様に思います。
肌寒い日が続いております。皆様もお体には十分お気をつけて、残りわずかとなった2023年を駆け抜けましょう。

さてアドベントカレンダー11日目、今日の題材として私が選んだのはこちら!
AzureDevOps Pipelines を使って Azureリソース を作ってみよう!です。
なぜこの題材を選んだのかは最後にお伝えするとして、早速本題に入っていきたいと思います。

Azure DevOps プロジェクトの準備

まず Azure DevOps でのプロジェクトの作成 のドキュメントに沿って、Azure DevOps上にプロジェクトを作成します。

今回は以下の様なプロジェクトを作成しました。

次にプロジェクトの Repos にある Clone in VS Code から、ローカルにプロジェクトをクローンしておきます。

Azure と DevOps を関連付ける

  1. Azure ポータルで、リソースを作成する Azure サブスクリプション にログインし、Microsoft Entra ID のアプリの登録で先ほど作成した DevOps プロジェクトを登録します。

  2. 登録したアプリのシークレットを作成します。

  3. 作成されたシークレットの値をコピーします。
    作成直後しかコピーできないため注意が必要です。

  4. サブスクリプションのアクセス制御(IAM)で、登録したアプリに対し共同作成者権限を付与します。

  5. DevOps の Project Settings で Service Connection を作成します。

  6. 作成画面で入力する項目は以下の通りです。

    • connection type:Azure Resource Manager
    • Authentication method:Service principal (manual)
    • Subscription Id:サブスクリプションID
    • Subscription Name:サブスクリプション名
    • Service Principal Id:図①
    • Service principal key:3.でコピーしたシークレット値
    • Tenant ID:図②
    • Service connection name:任意の値 (後で使用するのでコピーしておく)
    • Security:Grant access permission to all pipelines にチェック (図は Microsoft Entra ID に登録したアプリの概要ページ)

これで Azure と DevOps プロジェクト関連付けができました。
ざっくり言うと、Pipelines から Azure リソースにアクセスしていいよーという設定になります。

リソースを作成するシェルスクリプトをプッシュする

今回は以下の様なシェルスクリプトを用意しました。
【CreateResource.sh】

#!/bin/bash

# パラメータ
location="japaneast"
RGName="CreateAzureResourceDemo-RG"
planName="SampleAppPlan"
num="1"
sku="B1"
webAppName="SampleApp20231211"

# リソース作成
az group create --location $location --name $RGName
az appservice plan create --resource-group $RGName --name $planName --number-of-workers $num --sku $sku
az webapp create --resource-group $RGName --name $webAppName --plan $planName

変数に値をセットし、 それをパラメータとして azコマンド で以下リソースを作成しています。

  • リソースグループ
  • App Service プラン
  • Web app

このシェルスクリプトを、クローンしたプロジェクトフォルダに保存し DevOps にプッシュします。

DevOps でパイプラインを作成する

  1. DevOps の Pipelines で Create Pipline を選択します。 各設定タブでは以下を選択します。

    • Connect:Azure Repos Git
    • Select:対象となるリポジトリ
    • Configure:Starter pipeline
  2. Review タブで Variables を選択し、任意の名前と「Azure と DevOps を関連付ける」の 6. で設定した Service connection name を値に持つ Variable を作成します。

  3. 同じく Review タブで yamlファイルを以下に書き換え保存します。

     trigger:
     - none
    
     pool:
        vmImage: ubuntu-latest
    
      stages:
      - stage: CreateResource
        jobs:
           - job:
             displayName: CreateResource
             steps:
                - task: AzureCLI@2
                   inputs:
                    azureSubscription: $({Variablesで作成した変数名})
                    scriptType: 'bash'
                    scriptPath: 'CreateResource.sh'
    

Save and run を押すとパイプラインが作成され、そのまま実行されます。
yamlファイルのジョブでシェルスクリプトが呼び出され、そこに記述された azコマンド が実行されます。

結果を確認する

パイプラインが完了したことを確認し、Azureポータルからリソースが作成されていることを確認します。

パラメータを Variables で管理する

前の手順では、シェルスクリプト内でパラメータに値を直接セットしていましたが、これでは汎用性に欠けてしまいます。
例えば今のパイプラインは残しつつ、先ほどと同じリソースのセットを違うリージョンでも作りたいんだよなーとなった場合、シェルスクリプトをコピーしてわざわざ中身を書き換える必要があります。 ここでは、シェルスクリプトをテンプレート化して、 DevOps上で Variables の値を変えるだけで使いまわしができるようにする方法をご紹介します。

  1. azure-pipelines.yml の inputs に arguments を追加し、Variables で管理したい値を $(変数名)のかたちで記述、複数ある場合は半角スペース区切りで列挙して保存します。

  2. CreateResource.sh でパラメータをセットしていた部分を全て削除し、azコマンドの各パラメータを arguments の左から数えた順で数値に書き換え保存します。
    例えば RGName は arguments では左から2番目に位置しているので、$2 とします。
    (エンジニアの方であれば0始まりでカウントしてしまいそうですが、ここでは1始まりですw)

  3. arguments に列挙した変数名それぞれに対して、Variables で値を設定します。

Run を押すと再びパイプラインが実行され、先ほどと同じように Azure にリソースが作成されます。
このようにパラメータを Variables から受け渡すようにすることで、シェルスクリプトや yamlファイルをテンプレートとして使いまわすことが可能になります。

まとめ

作成したいリソースそれぞれの azコマンド を記述したシェルスクリプトを用意し、そのスクリプトを yamlファイル内で実行しました。今回は複数のリソースを作成するという作業があると仮定し、パイプラインを実行することで一度に済ませる方法のご紹介でした。これが一度きりの作業であれば返って手間となってしまいますが、これが定期的に発生する作業なのであれば、このような手順を用意しておくことで効率的且つ正確に行うことができるようになりますね。

「なぜこの題材を選んだのか」という部分がまさにこの理由で、稼働中の Web app を スケールアップさせたり、DBのスペックを一時的に上げて、しばらく経ったらまた下げてといった作業を定期的に行うという運用業務がありました。またそれは複数のリソースを同時に操作するといった作業で、その度に数人が集まってお互いに確認し合いながら慎重に作業を進めます。
ただこの作業は本番稼働中のリソースを AzureポータルからGUIで操作するということもあり、やはり緊張感は拭えませんし、作業ミスは絶対に避けなければならないというプレッシャーが非常に負担となっていました。
そこで今回ご紹介した方法を応用して、事前にパラメータの設定さえ行っておけば後はボタン一つで全て完了するというように改善することができました。

という事で今年の振り返りも兼ねて、頑張ったな!と思う取り組みの一つとして、今回の題材としてご紹介させて頂きました!
何かのご参考になると幸いです。
それでは明日の ふるの さんにバトンターーーッチ!皆さんお楽しみに (@^^)/~~~


サービス一覧 www.alterbooth.com cloudpointer.tech www.alterbooth.com