fbpx

ビルドコンテナを利用した Azure Functions 開発環境の構築 #VSCode #development #DevContainer #AzureFunctions

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

はじめに

.NET 5 (C#) で Azure Function のサーバーレスアプリケーションの開発をしております。本稿では、その開発環境についてご紹介したいと思います。OS は Windows 10 です。

 開発に必要なアプリや SDK

Azure Functions のアプリを開発するには、以下の開発ツールと SDK をインストールする必要があります。

  • Visual Studio Code (略称: VS Code)
  • Git
  • .NET 5 SDK (& .NET Core 3.1 SDK)
  • Azure Functions Core Tools
  • Azure PowerShell module

これらをインストールすることは少々面倒であり、開発者が増えたり PC の変更などで環境を作り直したりするときに、同じ作業の繰り返しになってしまいます。

Dev Container

そこで、そういった手間を少しでも減らすために、ビルド環境をコンテナ化して、再構築や設定の共有が簡単にできる仕組みを考えてみます。Microsoft から、開発用コンテナの情報が提供されていますので、それを参考にします。
https://code.visualstudio.com/docs/remote/containers

Dev Container 内では VS Code Server が動いており、ローカルの VS Code から接続することができます。VS Code Server には VS Code と同じように拡張機能を追加することができます。またビルド、デバッグも実行することができます。GUI がないので、ローカルの VS Code から接続し、操作する形になります。

ソースコードは、プロジェクトルートのフォルダをコンテナにマウントして参照します。コンテナ内でのアップデートは、そのままローカル上でも反映されます。

インストール

Docker Desktop for Windows

Windows でコンテナを使用できるようにするため、以下のソフトウェアをインストールします。手順は省略しますが、リンク先を参考にしてください。

C:\>wsl -l -v
  NAME                   STATE          VERSION
* docker-desktop-data    Running        2
  docker-desktop         Running        2

C:\>docker -v
Docker version 20.10.6, build 370c289

C:\>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE

これでインストールが完了しました。Docker はイメージが全くない、真っ新な状態です。

Visual Studio Code

統合開発環境となる Visual Studio Code をインストールします。
https://code.visualstudio.com/download

インストール後、以下の拡張機能を Marketplace からインストールします。

  • Remote - Containers (ms-vscode-remote.remote-containers) ★
  • Docker (ms-azuretools.vscode-docker)
  • Japanese Language Pack for Visual Studio Code (MS-CEINTL.vscode-language-pack-ja)

★は必須の拡張機能

PowerShell 7

最新の PowerShell もインストールしておきます。ただし、必須ではありません。
https://docs.microsoft.com/ja-jp/powershell/scripting/overview?view=powershell-7.1

画面右上の [PowerShell のダウンロード] ボタンをクリックすると、ダウンロードページに遷移します。PowerShell 7 をインストールすると、VS Code のターミナルが PowerShell 7 になります。

Dev Container 起動準備

まずは、開発プロジェクトのルートフォルダを作成します。VS Code でターミナルを起動 (Ctrl + @) し、フォルダを作成します。ここでは、C ドライブ直下に、MySolution という名前のフォルダを作成します。

PS C:\> New-Item MySolution -ItemType Directory

Directory: C:\

Mode LastWriteTime Length Name 
---- ------------- ------ ---- 
d---- 2021/06/02 14:30 MySolution

続いて、作成した MySolution を VS Code で開きます。

PS C:\> code MySolution -r

MySolution フォルダ配下に .devcontainer という名前のフォルダを作成し、その中に Dev Container を起動するための設定ファイル devcontainer.jsonと、コンテナイメージを作成するための Dockerfile を追加します。

PS C:\MySolution> New-Item .devcontainer -ItemType Directory

Directory: C:\MySolution

Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2021/06/02 14:39 .devcontainer

devcontainer.json の内容は以下の通りです。(参考: https://code.visualstudio.com/docs/remote/devcontainerjson-reference)

{
    "name": "C# Dev Env for Azure Functions",

    // コンテナ起動時に、コンテナ内で実行されるコマンド
    "postStartCommand": "if [ -e MySolution.sln ]; then dotnet restore && dotnet list package; fi",

    // Dev Container のビルド設定
    "build": {
        "dockerfile": "Dockerfile",
        "args": { 
            "VARIANT": "5.0",
            "INSTALL_DOTNET_3": "true",
            "INSTALL_USER_MODULES": "true"
        }
    },
    "settings": {
        "terminal.integrated.profiles.linux": {
            "bash": {
                "path": "/bin/bash",
            },
            "pwsh": {
                "path": "/bin/pwsh",
                "icon": "terminal-powershell"
            }
        },
        "terminal.integrated.defaultProfile.linux": "bash"
    },
    // VS Code Server に追加する拡張機能
    "extensions": [
        "ms-dotnettools.csharp",
        "ms-azuretools.vscode-azurefunctions",
        "Azurite.azurite"
    ],
    "portsAttributes": {
        "5000": {
            "onAutoForward": "notify"
        }
    },
    "remoteUser": "vscode"
}

Dockerfile の内容は以下の通りです。

ARG VARIANT="5.0"
FROM mcr.microsoft.com/vscode/devcontainers/dotnetcore:0-${VARIANT}

RUN wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb && \
    dpkg -i packages-microsoft-prod.deb && \
    apt-get update && \
    apt-get install -y azure-functions-core-tools-3

ARG INSTALL_DOTNET_3="false"
RUN if [ "$INSTALL_DOTNET_3" = "true" ]; then apt-get install -y dotnet-sdk-3.1; fi

USER vscode
ARG INSTALL_USER_MODULES="false"
RUN if [ "$INSTALL_USER_MODULES" = "true" ]; then \
      dotnet new --install Microsoft.Azure.WebJobs.ProjectTemplates && \
      pwsh -Command Install-Module -Name Az -Scope CurrentUser -Force; \
    fi

この時点で、フォルダツリーは以下のようになります。

Dev Container 起動

準備ができたので、さっそく起動してみます。VS Code で F1 キーを押下するとコマンドパレットが起動しますので、以下のコマンドを入力します。

>Remote-Containers: Reopen in Container

今 開いているフォルダ (MySolution) を、Dev Container から開くコマンドです。まだコンテナイメージはないので、そのビルドから開始されます。なお、イメージビルドは初回実行の時だけ行われますので、Dockerfile を更新した場合は、明示的にリビルドコマンド (Rebuilid Container, Rebuild and Reopen Container) を実行する必要があります。

イメージサイズが大きいので時間がかかりますが、ビルドが成功して Dev Container が起動したら以下のようになります。VS Code の表示は、ローカルのものではなく Dev Container の VS Code Server のものになります。なので、拡張機能は VS Code Server に追加されたものが表示され、ターミナルも PowerShell ではなく bash になっていることが確認できます。

 

ローカルのコマンドプロンプトから docker コマンドを実行し、コンテナが起動していることを確認します。

C:\>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vsc-mysolution-df8e58b35bf5eb281b180d42cd34e07d latest 9446846343d8 About an hour ago 2.12GB

C:\>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94ec6709ca59 vsc-mysolution-df8e58b35bf5eb281b180d42cd34e07d "/bin/sh -c 'echo Co…" About an hour ago Up About an hour hungry_archimedes

開発プロジェクトの作成とデバッグ

ここからはターミナルでコマンド入力をしながらプロジェクトファイルを作成していきます。

ソリューション

まずは、プロジェクトを整理するためのソリューションファイル (.sln) を作成します。

vscode ➜ /workspaces/MySolution $ dotnet new sln
The template "Solution File" was created successfully.
vscode ➜ /workspaces/MySolution $ ls
MySolution.sln

プロジェクト

続いて、MyApp フォルダを作成し、

vscode ➜ /workspaces/MySolution $ mkdir MyApp

その中に Azure Functions のプロジェクトを作成します。F1 キーを押下してコマンドパレットを起動し、以下のコマンドを入力します。

>Azure Functions: Create New Project

作成先のフォルダは MyApp を指定します。言語は C#、ランタイムは .NET 5 を選択し、プロジェクトテンプレートとして HTTP trigger を指定します。関数名と名前空間の入力も求められますが、動作確認用なので初期値のままで OK です。承認レベルは Function を指定します。

次に、作成したプロジェクトをソリューションに追加します。

vscode ➜ /workspaces/MySolution $ dotnet sln add MyApp
Project `MyApp/MyApp.csproj` added to the solution.
vscode ➜ /workspaces/MySolution $ dotnet sln list
Project(s)
----------
MyApp/MyApp.csproj

これで、開発プロジェクトの作成は完了です。

デバッグ

HttpTrigger1.cs の 15 行目にブレイクポイントを付けてから、F5 キーを押下します。

Azure Functions Core Tools が起動し、関数の動作確認ができる状態になります。

関数を実行するための URL (ここでは http://localhost:7071/api/HttpTrigger1) をブラウザで開くと、VS Code のブレイクポイントで処理が一時停止することを確認します。

F5 キーを押下し処理を進めると、関数の処理が終了し、結果として Web ブラウザにテキストが表示されます。

デバッグできることを確認しました。あとは、コーディング作業を進めていくだけです。ローカルと同じ感覚で進めることができます。Azure へのデプロイメントについては省略しますが、Azure Functions 拡張機能や Azure DevOps などの CICD を利用するなど、様々な方法があります。

再接続

Dev Container 内の MySolution フォルダは、ローカルの C:\MySolution フォルダがマウントされたものなので、コンテナで操作すればローカル上でも更新が反映されることになります。VS Code を閉じて Dev Container を終了しても、このフォルダを Dev Container で接続 (開く) すれば、いつでも作業を再開できます。

まとめ

本稿では、Dev Container での開発環境の構築についてご紹介させていただきました。Azure Functions を例に紹介しましたが、それ以外のアプリの開発環境も構築可能です。

最後に、Dev Container のメリットをまとめます。

  • ローカル環境をよごさない。(複数種の開発言語をローカルにインストールする必要がない)
  • 複数の開発者間で同一の環境を簡単に作成できる。
  • 同一種のプロジェクトでも、複数の独立した開発環境を用意できる。

構築はそれほど難しくないので、興味がある方は是非お試しください。

クリエーションライン(株) 富山事業所
〒939-8201 富山県富山市花園町3-2-9 池田ビル 3F
Twitter: CL_toyama
新規CTA