# Azure Container Instance上のゲートウェイ

<figure><img src="/files/zjKw8e3aFBkRzj4aRtOd" alt=""><figcaption></figcaption></figure>

## 概要 <a href="#overview" id="overview"></a>

本文書では、Azure Container Instance上にKeeperゲートウェイをインストール、構成、更新する手順を説明します。Keeperゲートウェイのコンテナは、Rocky Linux 9のベースイメージを基にビルドされ、[DockerHub](https://hub.docker.com/r/keeper/gateway)で配布されています。

## 要件 <a href="#prerequisites" id="prerequisites"></a>

#### Azure環境の要件 <a href="#azure-environment-requirements" id="azure-environment-requirements"></a>

* **リソースグループ:** ゲートウェイ専用のリソースグループ
* **仮想ネットワーク (VNet):** ゲートウェイ用の専用サブネットを備えたVNet
* **サブネットの委任:** 指定したサブネットは `Microsoft.ContainerInstance/containerGroups` に委任されている必要があります
* **サブスクリプションの権限:** Container Instanceとネットワークリソースを作成できる共同作成者 (Contributor) ロールの権限

#### Docker Hubの認証 <a href="#docker-hub-authentication" id="docker-hub-authentication"></a>

Azureで匿名プルに起因するレート制限を避けるため (多くの場合 `429 Too Many Requests` や `Manifest Unknown` といったエラーになります)、次のものが必要です。

* **Docker Hubアカウント:** [hub.docker.com](https://hub.docker.com)に登録したアカウント
* **パーソナルアクセストークン:** **\[アカウント設定]** > **\[セキュリティ]** で生成し、`Read Only` 権限を付与したトークン

<figure><img src="/files/UfEG4WARSoGqveWyJsF4" alt=""><figcaption></figcaption></figure>

***

## ゲートウェイの作成 <a href="#create-a-gateway" id="create-a-gateway"></a>

新しいゲートウェイのデプロイは、ウェブボルトまたはデスクトップアプリで **\[新規作成]** > **\[ゲートウェイ]** と進むと作成できます。

Keeperコマンダー CLIからゲートウェイと構成ファイルを作成することもできます。

```
pam gateway new -n "<Gateway Name>" -a <Application Name or UID> -c b64
```

アプリケーション名とUIDは `secrets-manager app list` で確認できます。

### デプロイマニフェスト <a href="#deployment-manifest" id="deployment-manifest"></a>

Docker ComposeファイルはボルトのUIから取得できます。このファイルを基にデプロイマニフェストを作成し、`keeper-gateway.yml` として保存してください。デプロイマニフェストの例を以下に示します。

```
apiVersion: 2024-05-01-preview
location: <AZURE_REGION> # Example: westeurope
name: <GATEWAY_INSTANCE_NAME>
type: Microsoft.ContainerInstance/containerGroups
properties:
  osType: Linux
  restartPolicy: Always
  sku: Standard
  imageRegistryCredentials:
  - server: index.docker.io
    username: <DOCKER_HUB_USERNAME>
    password: <DOCKER_HUB_PAT_TOKEN>
  containers:
  - name: keeper-gateway
    properties:
      image: keeper/gateway:latest
      resources:
        requests:
          cpu: 2.0
          memoryInGB: 8.0
      ports:
      - port: 443
        protocol: TCP
      environmentVariables:
      - name: ACCEPT_EULA
        value: Y
      - name: GATEWAY_CONFIG
        secureValue: <YOUR_BASE64_CONFIG_STRING>
      volumeMounts:
      - name: devshm
        mountPath: /dev/shm
  ipAddress:
    type: Private
    ports:
    - port: 443
      protocol: TCP
  subnetIds:
  - id: /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RG_NAME>/providers/Microsoft.Network/virtualNetworks/<VNET_NAME>/subnets/<SUBNET_NAME>
  volumes:
  - name: devshm
    emptyDir: {}
```

#### 必須パラメータ <a href="#required-parameters" id="required-parameters"></a>

| **パラメータ**                     | **説明**                                       |
| ----------------------------- | -------------------------------------------- |
| `<AZURE_REGION>`              | VNetと対象VMのあるAzureリージョン                       |
| `<GATEWAY_INSTANCE_NAME>`     | Azure上のこのコンテナグループの一意の名前                      |
| `<DOCKER_HUB_USERNAME>`       | Docker HubのユーザーID (本番のプル回数制限対策に必要)           |
| `<DOCKER_HUB_PAT_TOKEN>`      | Docker Hubで生成したパーソナルアクセストークン                 |
| `<YOUR_BASE64_CONFIG_STRING>` | ゲートウェイを生成した際にKeeperボルトから得られる構成文字列            |
| `<SUBSCRIPTION_ID>`           | 36文字のAzureサブスクリプションID                        |
| `<SUBNET_NAME>`               | `Microsoft.ContainerInstance` に委任されたサブネットの名前 |
| `<VNET_NAME>`                 | サブネットが属する仮想ネットワークの名前                         |

外部ストレージを用意せず共有メモリ要件を満たすため、 `/dev/shm` には `emptyDir` を使用します。このストレージは永続化されません。ACIのデプロイを削除または更新するとデータは消去されますが、ゲートウェイは状態と録画をKeeperクラウドへ同期するため、この挙動で問題ありません。

Azure Container Instances (ACI) では既定でHyper-V分離が用いられるため、seccompやAppArmorは使われません。

***

## デプロイ <a href="#deployment" id="deployment"></a>

YAMLファイルの準備ができたら、ファイルをアップロードし、Azure CLIで次のコマンドを実行してサービスを起動してください。

<figure><img src="/files/RKi9URD0uFVTxDu22OHC" alt=""><figcaption></figcaption></figure>

**コンテナグループの作成**

```
az container create --resource-group <RESOURCE_GROUP_NAME> --file keeper-gateway.yml
```

**サービスの確認**

{% code overflow="wrap" %}

```
az container show --resource-group <RESOURCE_GROUP_NAME> --name <GATEWAY_INSTANCE_NAME> --query instanceView.state
```

{% endcode %}

<figure><img src="/files/ecgSK3Tmtfex9io4a6aL" alt=""><figcaption></figcaption></figure>

**ログの取得**

```
az container logs --resource-group <RESOURCE_GROUP_NAME> --name <GATEWAY_INSTANCE_NAME>
```

***

## ゲートウェイサービスの管理 <a href="#gateway-service-management" id="gateway-service-management"></a>

Azure Container Instance (ACI) 環境では、Azure CLIまたはAzureポータルから管理します。

#### サービスの制御 <a href="#service-control" id="service-control"></a>

**サービスの起動**

マニフェストをデプロイするとサービスは自動的に起動します。コンテナが停止している場合は、次のコマンドを実行します。

```
az container start --resource-group <RG_NAME> --name <GATEWAY_NAME>
```

**サービスの停止**

ゲートウェイを一時的に止める場合は、次のコマンドを実行します。

```
az container stop --resource-group <RG_NAME> --name <GATEWAY_NAME>
```

**サービスの再起動**

YAMLマニフェストの構成を変更したあとに必要な場合は、次のコマンドを実行します。

```
az container restart --resource-group <RG_NAME> --name <GATEWAY_NAME>
```

#### ゲートウェイコンテナへの接続 <a href="#connecting-to-the-gateway-container" id="connecting-to-the-gateway-container"></a>

ネットワーク接続のデバッグやコンテナ内の環境変数の確認には、対話型のシェルセッションを開始できます。

{% code overflow="wrap" %}

```
az container exec --resource-group <RG_NAME> --name <GATEWAY_NAME> --exec-command "/bin/bash"
```

{% endcode %}

<figure><img src="/files/EzwUNN11o5Uxa9BnRVaT" alt=""><figcaption></figcaption></figure>

#### ゲートウェイの更新 <a href="#updating-the-gateway" id="updating-the-gateway"></a>

本番インスタンスを最新バージョンに更新する場合の手順です。

**プルして再起動**

イメージのプルポリシーが許可する場合は、再起動時にACIが `:latest` タグのイメージを自動プルします。確実に更新するには、コンテナグループの作成コマンドを再実行する方法がおすすめです。

```
az container create --resource-group <RG_NAME> --file keeper-gateway.yml
```

## デバッグとヘルスチェック <a href="#debugging-health-checks" id="debugging-health-checks"></a>

#### 詳細ログ <a href="#verbose-logging" id="verbose-logging"></a>

ローテーション失敗やトラブルシューティング用にデバッグログを有効にする場合は、YAMLの `environmentVariables` セクションに次の変数を追加します。

```
environmentVariables:
      - name: KEEPER_GATEWAY_LOG_LEVEL
        value: "debug"
      - name: LOG_LEVEL
        value: "debug"
```

#### ヘルスチェック <a href="#health-checks" id="health-checks"></a>

ロードバランシングや自動フェイルオーバー向けにゲートウェイの稼働状態を監視する場合は、ライブネスプローブを構成すると、ゲートウェイが応答しなくなった際にコンテナを自動的に再起動できます。

```
properties:
      livenessProbe:
        httpGet:
          path: /health
          port: 443
        initialDelaySeconds: 30
        periodSeconds: 10
```

***

## スケーリングと高可用性 <a href="#scaling-and-high-availability" id="scaling-and-high-availability"></a>

追加のコンテナをデプロイする前に、スケーリングと高可用性のためのゲートウェイ設定が必要です。

Keeperコマンダーにログインしたうえで、次のコマンドでゲートウェイの一覧を取得します。

```
pam gateway list
```

スケーリング対象のゲートウェイに対して、次のコマンドを実行します。

```
pam gateway set-max-instances -g <GATEWAY_UID> -m <MAX_INSTANCES>
```

* `<GATEWAY_UID>` はスケーリングするゲートウェイのUIDです。
* `<MAX_INSTANCES>` は許可するゲートウェイインスタンス数の上限です。

**例**

最大5つのゲートウェイインスタンスを同時に実行できるようにする場合のコマンド例です。

```
pam gateway set-max-instances -g Dmg5bh63p3Yj7ov738BTAw -m 5
```

ゲートウェイのスケーリングと高可用性の詳細は、次をご参照ください。

* [スケーリングと高可用性](#scaling-and-high-availability)

ACIではスケーリングは水平方向です。同一の `GATEWAY_CONFIG` を使い、互いに独立したコンテナグループを複数デプロイします。

2つ目のインスタンスを追加するには、YAMLファイルを複製し、コンテナグループ名とYAMLファイル名を変更します。

```
apiVersion: 2024-05-01-preview
location: <AZURE_REGION> # Example: westeurope
name: <GATEWAY_INSTANCE_NAME> <- rename
type: Microsoft.ContainerInstance/containerGroups
properties:
```

新しいYAMLファイルをアップロードし、デプロイコマンドを実行します。

```
az container create --resource-group <RESOURCE_GROUP_NAME> --file keeper-gateway-2.yml
```

各インスタンスは既存のプールに自動的に参加します。

***

## ネットワーク構成 <a href="#network-configuration" id="network-configuration"></a>

Keeperゲートウェイはアウトバウンド専用の接続を確立するため、インバウンドのファイアウォールルールは必要ありません。ただし、以下のアウトバウンド接続は許可されている必要があります。

| 宛先エンドポイント                                                                                                                                                                                                                                                                             | 必要なポート                                                                           | 備考                                                               |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| <p><strong>Keeperクラウド</strong> <code>keepersecurity.\[x]</code></p><p>エンドポイント:</p><p>US: <code>.com</code></p><p>EU: <code>.eu</code></p><p>AU: <code>.com.au</code></p><p>JP: <code>.jp</code></p><p>CA: <code>.ca</code></p><p>US\_GOV: <code>.us</code></p>                        | TLSポート443                                                                        | Keeperクラウドと通信し、ネイティブプロトコル (例: SSH、RDP) を介して対象インフラストラクチャにアクセスします。 |
| <p><strong>Keeperルーター</strong> <code>connect.keepersecurity.\[x]</code></p><p>エンドポイント:</p><p>US: <code>.com</code></p><p>EU: <code>.eu</code></p><p>AU: <code>.com.au</code></p><p>JP: <code>.jp</code></p><p>CA: <code>.ca</code></p><p>US\_GOV: <code>.us</code></p>                | TLSポート443                                                                        | Keeperルーターと通信し、安全なリアルタイムWebSocket接続を確立します。                       |
| <p><strong>Keeper Stun/Turnサービス</strong></p><p><code>krelay.keepersecurity.\[x]</code></p><p>エンドポイント:</p><p>US: <code>.com</code></p><p>EU: <code>.eu</code></p><p>AU: <code>.com.au</code></p><p>JP: <code>.jp</code></p><p>CA: <code>.ca</code></p><p>US\_GOV: <code>.us</code></p> | <p>TCPおよびUDPのポート3478を開放。<br><br>さらに、TCPおよびUDPのポート49152～65535のアウトバウンドアクセスを許可。</p> | ゲートウェイを介して、エンドユーザーのボルトと対象システム間の安全で暗号化されたWebRTC接続を確立します。          |

ゲートウェイでは、すべての暗号化および復号化処理をローカルで実行することでゼロ知識を保持します。Keeperクラウドとの通信にはKeeperシークレットマネージャーのAPIを使用します。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.keeper.io/keeperpam/jp/privileged-access-manager/getting-started/gateways/gateway-on-azure-container-instance.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
