AzureContainerRegistryのプライベートアクセスでの使用方法

# AzureContainerRegistryとは
AzureContainerRegistry（以降ACRと呼ぶ）とはDockerイメージを管理するAzureリソース ≒ DockerHubである。
クラウドプラットフォームにAzureを採用するとき、DockerHubの代わりに使用する。
# Dockerイメージとは
```plantuml
node PC {
    file Dockerfile<<テキストファイル>>
    file Dockerイメージ as localcon
}
cloud azure {
    package ACR {
        package リポジトリA {
            artifact "Dockerイメージ：タグ2" as Dockerイメージ<<オブジェクト>>
            artifact "Dockerイメージ：タグ1" as Dockerイメージ2<<オブジェクト>>
        }
        package リポジトリB
        package リポジトリC
    }
    collections Dockerコンテナ<<Dockerイメージのインスタンス>>
}
Dockerfile -> localcon:docker build
localcon -> Dockerイメージ: docker image push
Dockerイメージ --> Dockerコンテナ:docker run
Dockerイメージ -[hidden]-> Dockerイメージ2
Dockerイメージ2 -[hidden]-> リポジトリA
リポジトリA -[hidden]-> リポジトリB
リポジトリB -[hidden]-> リポジトリC
```
# パブリックアクセスでの使用方法
[ACRタスク](
https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-tasks-overview)を使用する。
```bash
az acr build --image sample/hello-world:v1 --registry myContainerRegistry008 --file Dockerfile .
```
<details><summary>以下はコマンドの詳細な説明です</summary>

* az acr build
    * Azure CLIのコマンドで、Azure Container Registryを操作するためのサブコマンドです。
* --image sample/hello-world:v1
    * Dockerイメージの名前とタグを指定する部分です。イメージ名はsample/hello-worldで、タグはv1です。
* --registry myContainerRegistry008
    * ここでmyContainerRegistry008はAzure Container Registryの名前です。指定されたレジストリにイメージがプッシュされます。
* --file Dockerfile
    * DockerイメージをビルドするためのDockerfileのパスを指定します。この例では、カレントディレクトリにある dockerfile という名前のファイルを使用しています。
* 最後の.
    * ビルドに使用するソースコードのディレクトリを指定します。この例では、カレントディレクトリを使用しています。

このコマンドを実行すると、指定したDockerfileを使用してDockerイメージがビルドされ、指定されたAzure Container Registryにプッシュされます。プッシュされたイメージはsample/hello-world:v1としてAzure Container Registryに格納されます。
</details>

[※プライベートアクセスではaz acr buildは使用できない](https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-private-link#execute-the-az-acr-build-with-private-endpoint-and-private-registry)
```plantuml
cloud "PC or azure" {
    file Dockerfile<<テキストファイル>>
}
cloud Microsoft
cloud azure {
    package ACR {
        package リポジトリA {
            artifact "Dockerイメージ：タグ2" as Dockerイメージ<<オブジェクト>>
            artifact "Dockerイメージ：タグ1" as Dockerイメージ2<<オブジェクト>>
        }
        package リポジトリB
        package リポジトリC
    }
    collections Dockerコンテナ<<Dockerイメージのインスタンス>>
}
Dockerfile -> Microsoft:az acr build
Microsoft -> Dockerイメージ
Dockerイメージ --> Dockerコンテナ:docker run
Dockerイメージ -[hidden]-> Dockerイメージ2
Dockerイメージ2 -[hidden]-> リポジトリA
リポジトリA -[hidden]-> リポジトリB
リポジトリB -[hidden]-> リポジトリC
```
# プライベートアクセスの設定方法 - セルフホステッドエージェント
0. ACR展開先の仮想ネットワークを用意する
1. ACRインスタンスを作成する。
    * 価格オプション(sku)は`Premium` ※[プライベートアクセスに対応しているのはPremiumのみ](https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-skus)
    * ネットワークをプライベートアクセスにして、プライベートエンドポイントを作成する
2. ACRと同じ仮想ネットワークに仮想マシンを作成する。
3. 仮想マシンにDockerエンジンをインストールする
4. DockerCLIを利用してacrへイメージをpushする
```plantuml
cloud azure {
    node 仮想マシン {
        file Dockerfile<<テキストファイル>>
        file Dockerイメージ as localcon
    }
    package ACR {
        package リポジトリA {
            artifact "Dockerイメージ：タグ2" as Dockerイメージ<<オブジェクト>>
            artifact "Dockerイメージ：タグ1" as Dockerイメージ2<<オブジェクト>>
        }
        package リポジトリB
        package リポジトリC
    }
    collections Dockerコンテナ<<Dockerイメージのインスタンス>>
}
Dockerfile -> localcon:docker build
localcon --> Dockerイメージ: docker image push
Dockerイメージ --> Dockerコンテナ:docker run
Dockerイメージ -[hidden]-> Dockerイメージ2
Dockerイメージ2 -[hidden]-> リポジトリA
リポジトリA -[hidden]-> リポジトリB
リポジトリB -[hidden]-> リポジトリC
```

# Azure Pipeline での ACR の使用方法
```plantuml
cloud azureDevOps
cloud azure {
    node 仮想マシン {
        agent "Azure Pipelines エージェント" as agent
        file Dockerfile<<テキストファイル>>
        file Dockerイメージ as localcon
    }
    package ACR {
        package リポジトリA {
            artifact "Dockerイメージ：タグ2" as Dockerイメージ<<オブジェクト>>
            artifact "Dockerイメージ：タグ1" as Dockerイメージ2<<オブジェクト>>
        }
        package リポジトリB
        package リポジトリC
    }
    collections Dockerコンテナ<<Dockerイメージのインスタンス>>
}
azureDevOps --> agent : ジョブ
Dockerfile -> localcon:docker build
localcon --> Dockerイメージ: docker image push
Dockerイメージ --> Dockerコンテナ:docker run
Dockerイメージ -[hidden]-> Dockerイメージ2
Dockerイメージ2 -[hidden]-> リポジトリA
リポジトリA -[hidden]-> リポジトリB
リポジトリB -[hidden]-> リポジトリC
```

# プライベートアクセスの設定方法 - ACRタスク
ACRタスクを作成し、ACRタスクにACRのRBACを割り当てる
[※ACRタスクは信頼できるサービスに登録されている](https://learn.microsoft.com/ja-jp/azure/container-registry/allow-access-trusted-services#trusted-services)
```bash
az group create --name myResourceGroup --location japaneast
az acr create --resource-group myResourceGroup --name mycontainerregistry410 --sku Premium --public-network-enabled false
echo -e version: v1.1.0\\n\
steps:\\n\
  - build: -t \$Registry/hello-world:tag1 https://github.com/Azure-Samples/acr-tasks.git#master -f curl.dockerfile\\n\
  - push: ["\$Registry/hello-world:tag1"]\\n > helloworldtask.yaml
az acr task create --registry mycontainerregistry410 --name helloworldtask --context /dev/null --file helloworldtask.yaml --assign-identity --auth-mode None
principalID=$(az acr task show --name helloworldtask --registry mycontainerregistry410 --query identity.principalId --output tsv)
myregID=$(az acr show --name mycontainerregistry410 --query id --output tsv)
az role assignment create --assignee $principalID --scope $myregID --role acrpush
az acr task credential add --name helloworldtask --registry mycontainerregistry410 --login-server mycontainerregistry410.azurecr.io --use-identity [system]
az acr task run --name helloworldtask --registry mycontainerregistry410
```
```plantuml
actor 開発者
cloud "github or azure repo" {
    file Dockerfile<<テキストファイル>>
}
cloud azure {
    package ACR {
        agent ACRタスク
        package リポジトリA {
            artifact "Dockerイメージ：タグ2" as Dockerイメージ<<オブジェクト>>
            artifact "Dockerイメージ：タグ1" as Dockerイメージ2<<オブジェクト>>
        }
        package リポジトリB
        package リポジトリC
    }
    collections Dockerコンテナ<<Dockerイメージのインスタンス>>
}
開発者 -> ACRタスク:az acr task run
Dockerfile --> ACRタスク:build
ACRタスク -> Dockerイメージ:push
Dockerイメージ --> Dockerコンテナ:docker run
Dockerイメージ -[hidden]-> Dockerイメージ2
Dockerイメージ2 -[hidden]-> リポジトリA
リポジトリA -[hidden]-> リポジトリB
リポジトリB -[hidden]-> リポジトリC
```