はじめに
昨年末にContainer Instancesというサーバレスのコンテナ実行基盤がリリースされました。
こちらの記事でContainer Instancesを利用してWordPress環境を構築する方法が紹介されています。
Container Instanceでは、プライベートなコンテナレジストリからもイメージをPullできるようになっており、コンソールから資格情報を入力することができるようになっています。
しかし、OCI Vaultを利用することで、資格情報をよりセキュアに保管したり、再利用性を高めたりすることができます。
この記事では、Container Instancesで利用するコンテナレジストリの資格情報をOCI Vaultを利用して管理、利用する方法を見ていきます。
事前準備
いくつか事前準備があるので、そちらを実施していきます。
OCIRへのイメージの登録
今回は、プライベートなコンテナレジストリとしてOCIRを利用します。
OCIRにDocker HubからPullしてきたNGINXイメージをPushし、以降の手順で利用していきます。
OCIRにPushしたイメージはデフォルトでプライベートになります。
(もちろん、ユーザが意図的にパブリックにすることもできます)
まずは、Docker HubからNGINXイメージをPullします。
docker image pull nginx
Pullされたことを確認します。
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/nginx latest 448a08f1d2f9 13 days ago 147 MB
これをOCIRにPushします。
まずは、OCIRにログインします。
今回は東京リージョンを利用します。
docker login nrt.ocir.io
この際に入力するクレデンシャルは以下の通りです。
これを後ほどOCI Vaultに登録し、Container Instancesから利用します。
- username:
OCIで利用するアカウントユーザ - password:
認証トークン
上記の詳細は、下記のドキュメントをご確認ください。
ログインしたら、先ほどPullしたNGINXイメージをPushします。
まずはOCIRへPushするためにタグを作成します。
docker image tag nginx nrt.ocir.io/<オブジェクトストレージネームスペース>/nginx
<オブジェクトストレージネームスペース>はこちらでご確認ください。
docker image push nrt.ocir.io/<オブジェクトストレージネームスペース>/nginx
先ほど記載した通り、OCIRへPushしたイメージはデフォルトでプライベートになっているので、このイメージは資格情報がなければPullすることができません。
これでOCIRへのイメージの登録は完了です。
OCI Vaultへのコンテナレジストリの資格情報の登録
OCI Vaultを作成します。
OCIコンソール画面から、「アイデンティティとセキュリティ」 => 「ボールト」をクリックします。
遷移した画面で「ボールトの作成」をクリックします。
以下のパラメータを入力し、「ボールトの作成」をクリックします。
| key | value |
|---|---|
| 名前 | container instances |
「キーの作成」をクリックします。
以下のパラメータを入力し、「ボールトの作成」をクリックします。
| key | value |
|---|---|
| 名前 | container instances |
画面右端にある「シークレット」をクリックします。
「シークレットの作成」をクリックします。
以下のパラメータを入力し、「ボールトの作成」をクリックします。
| key | value | 備考 |
|---|---|---|
| 名前 | ocir-token | |
| 暗号化キー | container instances | |
| シークレットコンテンツ | {"username": "<OCIで利用するアカウントユーザ>", "password": "<認証トークン>"} |
前手順でのdocker loginで利用したクレデンシャル |
これで、OCI Vaultへのコンテナレジストリの資格情報の登録は完了です。
動的グループ/ポリシーの作成
先ほどOCI Vaultに登録したクレデンシャルをOCI Container Instancesから読み取れる必要があるので、ここではその設定を行なっていきます。
まず、Container Instancesを含んだ動的グループを作成します。
今回は、すべてのContainer InstancesがOCI Vault上のシークレットを読み取れるように設定します。
今回設定する動的グループとポリシーは以下の通りです。
| key | value | 備考 |
|---|---|---|
| 動的グループ | ALL {resource.type='computecontainerinstance'} | すべてのContainer Instancesを含めた動的グループ |
| ポリシー | allow dynamic-group <動的グループ名> to read secret-bundles in compartment | 動的グループ(すべてのContainer Instances)がシークレットを読み取り可能にするポリシー |
動的グループとポリシーは以下をご確認ください。
これで、事前準備は完了です。
Container Instancesの作成
Container Instancesを作成します。
今回実施するように、コンテナレジストリの資格情報をOCI Vaultから取得してContainer Instancesを作成する場合、コンソールからの作成はできません。
そのため、OCI CLIを利用してContainer Instancesを作成します。
今回は以下のようなJSONテンプレートを作成したので、こちらをコピーして利用してください。(東京リージョンの想定です)
{
"availabilityDomain": "TGjA:AP-TOKYO-1-AD-1",
"compartmentId": "<コンパートメントOCID>",
"containers": [
{
"imageUrl": "nrt.ocir.io/<オブジェクトストレージネームスペース>/nginx"
}
],
"imagePullSecrets": [
{
"registryEndpoint": "nrt.ocir.io/<オブジェクトストレージネームスペース>",
"secretId": "<OCI Vaultに作成したSecretのOCID>",
"secretType": "VAULT"
}
],
"shape": "CI.Standard.E3.Flex",
"shapeConfig": {
"memoryInGBs": 8.0,
"ocpus": 1.0
},
"vnics": [
{
"subnetId": "<サブネットOCID>"
}
]
}
このJSONファイルを利用して以下のコマンドを実行します。
oci container-instances container-instance create --from-json file://ci.json
結果が以下のようになればプロビジョニングされている状態です。
{
"data": {
"availability-domain": "TGjA:AP-TOKYO-1-AD-1",
"compartment-id": "ocid1.compartment.oc1..aaaaaaaaw4afdxxxxxxxxxxxxxxxxmrzgdq",
"container-count": 1,
"container-restart-policy": "ALWAYS",
"containers": [
{
"container-id": "ocid1.computecontainer.oc1.ap-tokyo-1.anxhiljrssl65iqaxxxxxxxxxxxxx7syrwgwjalivikfa",
"display-name": "computecontainer-dcc86a86-02c9-4b73-8696-7b72e7bc2b6c"
}
],
"defined-tags": {},
"display-name": "computecontainerinstance-57683e2f-c9cc-43b9-9d98-549808ee0a28",
"dns-config": null,
"fault-domain": null,
"freeform-tags": {},
"graceful-shutdown-timeout-in-seconds": 0,
"id": "ocid1.computecontainerinstance.oc1.ap-tokyo-1.anxhiljrssl65iqa24bztzxxxxxxxxxxxxxxxsuoj7x33vcpa",
"image-pull-secrets": [
{
"registry-endpoint": "nrt.ocir.io/<オブジェクトストレージネームスペース>",
"secret-id": "ocid1.vaultsecret.oc1.ap-tokyo-1.amaaaaaassl65iqarvs76xxxxxxxxxxxxxxxkygo54hq",
"secret-type": "VAULT"
}
],
"lifecycle-details": "Creating",
"lifecycle-state": "CREATING",
"shape": "CI.Standard.E3.Flex",
"shape-config": {
"memory-in-gbs": 8.0,
"networking-bandwidth-in-gbps": 1000.0,
"ocpus": 1.0,
"processor-description": "2.25 GHz AMD EPYC\u2122 7742 (Rome)"
},
"system-tags": {},
"time-created": "2023-05-18T04:55:54.370000+00:00",
"time-updated": "2023-05-18T04:55:54.370000+00:00",
"vnics": [
{
"vnic-id": null
}
],
"volume-count": 0,
"volumes": []
},
"etag": "1edc7d56b78194b5db33469xxxxxxxxxdcafb23b52539ac24f6e",
"opc-work-request-id": "ocid1.computecontainerworkrequest.oc1.ap-tokyo-1.abxhiljrjmk6wl5uzfoczgtthuxxxxxxxxxxxxdmi4zdmkwelr3adq"
}
コンソールから確認してみましょう。
コンテナイメージの情報が表示され、先ほどPushしたコンテナイメージが取得できていることが確認できます。
このようにOCI Vaultに格納されているシークレットの情報を利用してOCIRのコンテナイメージを取得することができました。
まとめ
この記事ではContainer Instances作成時に利用するコンテナレジストリの資格情報をOCI Vaultで管理、利用するという方法を紹介しました。
これを利用して、セキュアかつ再利用性の高い形でコンテナレジストリの資格情報を管理していきましょう!!
参考情報









