つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

COCOAから接触通知が来たのでPCR検査を受けてきた (陰性でした)

PCR検査の結果、陰性です。

9月2週目から3週目にかけて、タイトルにあるような出来事が起きたので、その間にやったことをまとめておきます。

9月11日(金)の夜に接触通知アプリのCOCOAから接触通知が来ました。
もちろん初めての通知だったので「おぉ?」と思い、COCOAを起動したら「陽性者との接触確認 1件」という画面が出てきました。

この段階での率直な感想は「うわーマジかよー」という感じ。

接触一覧をみると「9月8日」に接触していたらしい。
でも9月8日の行動を振り返っても、いわゆる濃厚接触にあたるような外出や活動はしていなかったので、まぁ一応大丈夫だろうなとは思っていた。

とはいえこのような通知が出てきたので色々と警戒しました。とりあえず家族にそれを伝えました。

このあと自分がどのような行動をすべきかを、COCOAから調べたり、厚生労働省のサイトを見たりして、ひとまず福岡県のCOVID-19の相談窓口に電話をかけました。
20時か21時くらいだったし、金曜日だったので、電話が繋がるか不安だったけど、何度かかけたら繋がりました。

COCOAで通知がでたから電話をしました」と伝え、経緯など質問されたことに答えていきました。
濃厚接触にはあたらないということで2週間の経過観察でよいという指示を受けたが、PCR検査を受けることはできますか?と聞いてみました。

COCOAで通知がでた人は濃厚接触者でなくとも、希望をすればPCR検査を受けられるということで、希望しました。
ただ、金曜日の夜ということもあり、次の月曜日に保健所に電話をして調整してくれということで、月曜を待つことになりました。

とりあえず通知が出た以上、週末は自宅でおとなしくするよう予定を変更しました。
また、PCR検査を受けて結果がでるまでは、家族みんなで家にいるようにしようかと家族会議をした。
私も妻も在宅勤務、娘は幼稚園をお休みすることにしました。

ここまでやらんでも、と思うかもしれないけど、結果が出るまではどう転ぶか分からないし、各所に迷惑をかけたくないので家に閉じこもることにしました。


9月14日(月)になったら指定された保健所に電話をかけ、改めて経緯を説明した上でPCR検査を希望しました。
検査日は保健所で調整したうえで改めて電話をもらうことになりました。
数時間後に保健所から、検査日が翌日になったと電話をもらい、検査の受け方の説明を受けました。

9月15日(火)、PCR検査日の当日です。
指定された検査時間に合わせて保健所に車で向かい、保健所から電話がくるまで車内で待機していました。

予定時間よりも早く検査を受けられるという電話をもらったので、検査場に向かいました。
このとき「マスクをつけること」「一般利用者と接触しないように別の入口を案内する」という指示に従いつつ、検査場に向かいました。

まず説明を軽く受け、PCR検査が始まりました。インフルエンザ検査と同じく、鼻奥で採取する方法でした。この痛みはいつまでも慣れないですねー。
5分程度で検査が終わり、結果は2日後に連絡が来るとのことでした。

9月17日(木)の午後に保健所から連絡があり、陰性だったという結果を受けました。ここで一安心。
翌日から娘を幼稚園につれていける安堵感が大きかったです。


ということで結果的に陰性となりましたが、通知を受けてから結果が出るまでの1週間のストレスは半端なかったです。

でもCOCOAをインストールしていたから接触を知ることができたという結果でもあるので、やっぱりCOCOAはインストールしましょうね。終わり。

Tye のコンテナーレジストリーに Azure Container Registry (ACR) を使用する

過去記事では AKS に Tye のサンプルアプリケーションをデプロイする際、コンテナーレジストリーには DockerHub を使用していました。
Tye では DockerHub の他に Azure Container Registry (ACR) を使用することができるため、今回は ACR を使ってみようと思います。

ドキュメントでいうとこのあたりになります。
https://github.com/dotnet/tye/blob/master/docs/reference/schema.md#registry-string

サンプルアプリケーションはこちら。

github.com

Azure Container Registry の作成

ポータルや CLI を使って ACR のリソースを作成します。
管理者ユーザーは無効のままで大丈夫です。

docs.microsoft.com

docs.microsoft.com

tye.yaml を変更する

tye.yamlregistry を書き換えて、コンテナーレジストリーに ACR を使うようにします。

変更前

name: microservice
registry: tsubakimoto
services:
- name: backend
  project: backend\backend.csproj
- name: frontend
  project: frontend\frontend.csproj
- name: redis
  image: redis
  bindings:
  - port: 6379
    connectionString: "${host}:${port}"
- name: redis-cli
  image: redis
  args: "redis-cli -h redis MONITOR"

変更後

name: microservice
registry: acrprojecttye.azurecr.io
services:
- name: backend
  project: backend\backend.csproj
- name: frontend
  project: frontend\frontend.csproj
- name: redis
  image: redis
  bindings:
  - port: 6379
    connectionString: "${host}:${port}"
- name: redis-cli
  image: redis
  args: "redis-cli -h redis MONITOR"

AKS にデプロイしてみる

アプリケーションには何も変更を加えずに AKS にデプロイしてみましょう。
AKS にデプロイするにはセットアップが必要なので、以前の記事を参考にしてください。

tsubalog.hatenablog.com

$ kubectl apply -f https://raw.githubusercontent.com/dotnet/tye/master/docs/tutorials/hello-tye/redis.yaml
deployment.apps/redis created
service/redis created

$ tye deploy --interactive
Loading Application Details...
Verifying kubectl installation...
Verifying kubectl connection to cluster...
Processing Service 'backend'...
    Applying container defaults...
    Compiling Services...
    Publishing Project...
    Building Docker Image...
        Created Docker Image: 'acrprojecttye.azurecr.io/backend:1.0.0'
    Pushing Docker Image...
            unauthorized: authentication required, visit https://aka.ms/acr/authorization for more information.
Drats! 'deploy' failed:
        'docker push' failed.

ACR へ認証を行う

AKS へのデプロイに失敗しました。理由は認証エラーですね。
ビルドしたコンテナーイメージをプッシュしようとしている ACR の認証をしていないためです。

エラーログにもある https://aka.ms/acr/authorization は ACR の認証に関するドキュメントです。

docs.microsoft.com

$ az acr login -n acrprojecttye
Login Succeeded

再度デプロイ

ACR にログインしたので改めてデプロイを実行します。

$ tye deploy --interactive
Loading Application Details...
Verifying kubectl installation...
Verifying kubectl connection to cluster...
Processing Service 'backend'...
    Applying container defaults...
    Compiling Services...
    Publishing Project...
    Building Docker Image...
        Created Docker Image: 'acrprojecttye.azurecr.io/backend:1.0.0'
    Pushing Docker Image...
        Pushed docker image: 'acrprojecttye.azurecr.io/backend:1.0.0'
    Validating Secrets...
        Enter the connection string to use for service 'redis': redis:6379
        Created secret 'binding-production-redis-secret'.
    Generating Manifests...
Processing Service 'frontend'...
    Applying container defaults...
    Compiling Services...
    Publishing Project...
    Building Docker Image...
        Created Docker Image: 'acrprojecttye.azurecr.io/frontend:1.0.0'
    Pushing Docker Image...
        Pushed docker image: 'acrprojecttye.azurecr.io/frontend:1.0.0'
    Validating Secrets...
    Generating Manifests...
Processing Service 'redis'...
    Applying container defaults...
        Service 'redis' does not have a project associated. Skipping.
    Compiling Services...
    Publishing Project...
        Service 'redis' does not have a project associated. Skipping.
    Building Docker Image...
        Service 'redis' does not have a project associated. Skipping.
    Pushing Docker Image...
        Service 'redis' does not have a project associated. Skipping.
    Validating Secrets...
    Generating Manifests...
        Service 'redis' does not have a container. Skipping.
Processing Service 'redis-cli'...
    Applying container defaults...
        Service 'redis-cli' does not have a project associated. Skipping.
    Compiling Services...
    Publishing Project...
        Service 'redis-cli' does not have a project associated. Skipping.
    Building Docker Image...
        Service 'redis-cli' does not have a project associated. Skipping.
    Pushing Docker Image...
        Service 'redis-cli' does not have a project associated. Skipping.
    Validating Secrets...
    Generating Manifests...
        Service 'redis-cli' does not have a container. Skipping.
Deploying Application Manifests...

        Verifying kubectl installation...
        Verifying kubectl connection to cluster...
        Writing output to '/tmp/tmpKE7MrI.tmp'.
        Deployed application 'microservice'.
Time Elapsed: 00:00:34:51

デプロイに成功しました。 Azure ポータルで ACR の状態を見るとイメージがプッシュされていることが分かります。

f:id:tech-tsubaki:20200912162931p:plain

AKS から ACR への認証

デプロイは成功しましたが Pod の状態はエラーになっています。
どうやらコンテナーレジストリーからイメージをプルできていないようです。

$ kubectl get po
NAME                        READY   STATUS         RESTARTS   AGE
backend-55cc974776-7kjwx    0/1     ErrImagePull   0          35s
frontend-59b55b7b94-pk5l2   0/1     ErrImagePull   0          35s
redis-58897bf8c-kdqd8       1/1     Running        0          2m8s

これも認証の問題で、今度は AKS から ACR への認証を設定する必要があります。
ドキュメントに沿って設定を行います。

docs.microsoft.com

$ az aks update -n aks-project-tye -g rg-project-tye --attach-acr acrprojecttye
{- Finished ..
  "aadProfile": null,
  "addonProfiles": {
    "httpapplicationrouting": {
      "config": {},
      "enabled": false,
      "identity": null
    },
    "kubedashboard": {
      "config": {},
      "enabled": true,
      "identity": null
    }
  },
  "agentPoolProfiles": [
    {
      "availabilityZones": null,
      "count": 1,
      "enableAutoScaling": null,
      "enableNodePublicIp": null,
      "maxCount": null,
      "maxPods": 110,
      "minCount": null,
      "mode": "System",
      "name": "agentpool",
      "nodeLabels": {},
      "nodeTaints": null,
      "orchestratorVersion": "1.16.10",
      "osDiskSizeGb": 128,
      "osType": "Linux",
      "provisioningState": "Succeeded",
      "scaleSetEvictionPolicy": null,
      "scaleSetPriority": null,
      "spotMaxPrice": null,
      "tags": null,
      "type": "VirtualMachineScaleSets",
      "vmSize": "Standard_DS2_v2",
      "vnetSubnetId": null
    }
  ],
  "apiServerAccessProfile": {
    "authorizedIpRanges": null,
    "enablePrivateCluster": false
  },
  "autoScalerProfile": null,
  "diskEncryptionSetId": null,
  "dnsPrefix": "aks-project-tye-dns",
  "enablePodSecurityPolicy": null,
  "enableRbac": true,
  "fqdn": "aks-project-tye-dns-04d99eee.hcp.japaneast.azmk8s.io",
  "id": "/subscriptions/1df1e3be-e3ae-4e0e-8c9a-742b8d0b8dfd/resourcegroups/rg-project-tye/providers/Microsoft.ContainerService/managedClusters/aks-project-tye",
  "identity": null,
  "identityProfile": null,
  "kubernetesVersion": "1.16.13",
  "linuxProfile": null,
  "location": "japaneast",
  "maxAgentPools": 10,
  "name": "aks-project-tye",
  "networkProfile": {
    "dnsServiceIp": "10.0.0.10",
    "dockerBridgeCidr": "172.17.0.1/16",
    "loadBalancerProfile": {
      "allocatedOutboundPorts": null,
      "effectiveOutboundIps": [
        {
          "id": "/subscriptions/1df1e3be-e3ae-4e0e-8c9a-742b8d0b8dfd/resourceGroups/MC_rg-project-tye_aks-project-tye_japaneast/providers/Microsoft.Network/publicIPAddresses/c9a695e4-4b80-40e6-bb16-05df8d207912",
          "resourceGroup": "MC_rg-project-tye_aks-project-tye_japaneast"
        }
      ],
      "idleTimeoutInMinutes": null,
      "managedOutboundIps": {
        "count": 1
      },
      "outboundIpPrefixes": null,
      "outboundIps": null
    },
    "loadBalancerSku": "Standard",
    "networkMode": null,
    "networkPlugin": "kubenet",
    "networkPolicy": null,
    "outboundType": "loadBalancer",
    "podCidr": "10.244.0.0/16",
    "serviceCidr": "10.0.0.0/16"
  },
  "nodeResourceGroup": "MC_rg-project-tye_aks-project-tye_japaneast",
  "privateFqdn": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "rg-project-tye",
  "servicePrincipalProfile": {
    "clientId": "fbba54b1-22e7-4072-8a41-9767bb23d41f",
    "secret": null
  },
  "sku": {
    "name": "Basic",
    "tier": "Free"
  },
  "tags": null,
  "type": "Microsoft.ContainerService/ManagedClusters",
  "windowsProfile": null
}

動作確認

AKS から ACR に正しく認証できたのでもう一度デプロイしてみます。ログは代わり映えしないので省略します。
イメージもプルできているためポートフォワードを設定して確認してみます。

$ kubectl get po
NAME                        READY   STATUS    RESTARTS   AGE
backend-55cc974776-lphwb    1/1     Running   0          66s
frontend-59b55b7b94-gql2d   1/1     Running   0          65s
redis-58897bf8c-5dg7b       1/1     Running   0          96s

$ kubectl port-forward svc/frontend 5000:80
Forwarding from 127.0.0.1:5000 -> 80
Forwarding from [::1]:5000 -> 80

f:id:tech-tsubaki:20200912162918p:plain

アプリケーションが動作していることが分かります。
Azure を使うならコンテナーレジストリーも ACR を使うことが多いと思いますが、 Tye もちゃんと ACR に対応しているため使い勝手が良さそうです。

Tyeの構成ファイルの tye.yaml のスキーマ定義を見てみる

これまで書いたProject Tyeの記事はこちら。

tsubalog.hatenablog.com

tsubalog.hatenablog.com


マイクロサービス開発ツールであるTyeはYamlファイルで構成を定義します。ファイル名は tye.yaml です。
今回はこの tye.yamlスキーマについて学びます。

tye.yamlスキーマGitHubで管理されており、誰でも閲覧することができます。
https://github.com/dotnet/tye/blob/master/docs/reference/schema.md

Visual Studio Codetye.yaml を書く準備

こちらのドキュメントに沿って環境を整えることで、Visual Studio Codetye.yaml を書く際にインテリセンスが表示されるようになります。
https://github.com/dotnet/tye/blob/master/src/schema/README.md

  1. Visual Studio CodeYaml拡張機能をインストールする
  2. Visual Studio Codeの設定画面を起動する (Ctrl+,)
  3. Yaml: Schemas」の設定を探し、settings.jsonを編集する
  4. "yaml.schemas"にTyeのスキーマファイルを指定する
{
  "yaml.schemas": {
    "https://raw.githubusercontent.com/dotnet/tye/master/src/schema/tye-schema.json": [
      "tye.yaml"
    ]
  }
}

スキーマの定義

過去記事のサンプルアプリケーションで使用している tye.yaml を例に説明します。
https://github.com/tsubakimoto/project-tye-sample/blob/master/tye.yaml

name: microservice
registry: tsubakimoto
services:
- name: backend
  project: backend\backend.csproj
- name: frontend
  project: frontend\frontend.csproj
- name: redis
  image: redis
  bindings:
  - port: 6379
    connectionString: "${host}:${port}"
- name: redis-cli
  image: redis
  args: "redis-cli -h redis MONITOR"

name プロパティ

Tyeでのアプリケーションの名前となります。このプロパティが使われることはほとんどないですが、Kubernetesにデプロイした場合はラベル名に使用されます。
このプロパティが指定されない場合は tye.yaml のあるディレクトリ名(小文字)が使用されます。

registry プロパティ

コンテナーレジストリの名前を指定します。DockerHubもしくはAzure Container Registryの名前を指定することができます。
ここで指定したコンテナーレジストリに、イメージやタグがプッシュされます。

namespace プロパティ

Kubernetesへのデプロイ時に、Kubernetes名前空間(namespace)として使用されます。
以前のサンプルアプリケーションでは namespace プロパティを使用していないので、後日検証してみようと思います。

services プロパティ

アプリケーションを構成するサービスを指定します。少なくとも1つは必要です。
services プロパティでは以下のプロパティを定義することができます。

name プロパティ

サービス名となり、DNS名として利用可能な文字種である必要があります。

  • 最大63文字
  • 英数字または「-」のみ
  • 英数字で始まる
  • 英数字で終わる

project プロパティ

.csproj ファイル、もしくは .fsproj ファイルのパスを指定します。ファイルパスは tye.yaml からの相対パスです。
このプロパティに指定されたプロジェクトは、ローカルでのビルドや実行の対象となり、パッケージ化の対象となります。

image プロパティ

Dockerイメージを使用する場合にイメージ名とタグを指定します。
上記のサンプルの image: redis は、redis というイメージの latest タグとなります。

bindings プロパティ

ドキュメントには「サービスによって公開されるバインディングのリスト」とあります。
該当のサービスが公開(実行)されるときのプロトコルに関する設定です。

args プロパティ

サービスの起動時に使用するコマンドライン引数となります。


他にも https://github.com/dotnet/tye/blob/master/docs/reference/schema.md には、スキーマ定義が記述されているため気になるものは後日検証してみようと思います。