Oracle Cloud Infrastructureに接続するためのFn ProjectのCLIコンテキストの作成

OCI Functionsで使用するためにOracle Cloud Infrastructureに接続するためのFn ProjectのCLIコンテキストの作成方法をご紹介します。

OCI関数を使用する前に、Oracle Cloud Infrastructureテナンシに接続するようにFn ProjectのCLIを構成する必要があります。

Fn ProjectのCLIが最初にインストールされるとき、これはローカル開発の「コンテキスト」用に構成されます。Oracle Cloud Infrastructureテナンシに接続するようFn ProjectのCLIを構成するには、かわりに新しいコンテキストを作成する必要があります。コンテキストでは、OCIファンクション・エンドポイント、デプロイされたファンクションが属するコンパートメントのOCID、およびイメージをプッシュおよびプルするDockerレジストリのアドレスを指定します。

複数のコンテキストを定義し、それぞれを.yaml形式で異なるコンテキスト・ファイルに格納できます。デフォルトでは、個々のコンテキスト・ファイルは~/.fn/contextsディレクトリに格納されます。 ~/.fn/config.yamlファイルは、Fn Projectが使用するコンテキスト・ファイルを指定します。

新規コンテキストを作成するには、新規コンテキスト・ファイルを手動で作成し、そのファイルを指すように~/.fn/config.yamlファイルを手動で編集します。また、次の説明のように、Fn ProjectのCLIを使用して新しいコンテキスト・ファイルを対話形式で作成し、Fn ProjectのCLIにそのファイルの使用を開始するように指示することもできます。

開発環境としてCloud Shellを使用している場合、2つのFn ProjectのCLIコンテキスト(現在のリージョンのデフォルト・コンテキストとコンテキスト)がすでに作成されています。詳細は、OCI Functions on Cloud Shell QuickStartガイドを参照してください。コマンドをコピーして、「スタート・ガイド」ページからクラウド・シェル・ウィンドウに貼り付ける必要があります:

  • 現在のリージョンのコンテキストを使用するようにFn ProjectのCLIに指示する手順
  • デプロイされたファンクションを所有するコンパートメントのOCIDを指定します
  • OCI Functionsで使用するOracle Cloud Infrastructure Registryアドレスを指定します

このトピックの手順では、次のことを前提としています:

Fn ProjectのCLIを使用して新しいコンテキストファイルを作成するには:

  1. ファンクション開発者として開発環境にログインします。

  2. ターミナル・ウィンドウで、次のように入力して、Oracle Cloud Infrastructure用の新しいFn ProjectのCLIコンテキストを作成します:

    fn create context <my-context> --provider oracle

    ここで、< my-context >は選択した名前です。例:

    fn create context johns-oci-context --provider oracle

    --provider oracleを指定すると、Oracle Cloud Infrastructureリクエスト署名、秘密キー、ユーザー・グループ、およびこれらのユーザー・グループに権限を付与するポリシーを使用して、認証および認可が有効になります。

  3. 次を入力して、Fn ProjectのCLIが新しいコンテキストを使用するように指定します:

    fn use context <my-context>

    ここで、< my-context >は前のステップで指定した名前です。例:

    fn use context johns-oci-context
  4. 次のように入力して、デプロイされたファンクションを所有するコンパートメントのOCIDを持つ新規コンテキストを構成します(この目的のために新規コンパートメントを作成した可能性があります。テナンシのネットワーク・リソースおよびOCIファンクション・リソースを所有するコンパートメントの作成(まだ存在しない場合)を参照してください):

    fn update context oracle.compartment-id <compartment-ocid>

    例:

    fn update context oracle.compartment-id ocid1.compartment.oc1..aaaaaaaarvdfa72n...
  5. 次のように入力して、APIのコール時に使用するapi-urlエンドポイントで新しいコンテキストを構成します。

    fn update context api-url <api-endpoint>

    ここで、<api-endpoint>は、ファンクションAPIのファンクション・エンドポイントのリストにあるエンドポイントの1つです。フォーマットはhttps://functions.<region-identifier>.oci.oraclecloud.comです。<api-endpoint><region-identifier>は、ファンクションを作成およびデプロイするOracle Cloud Infrastructureのリージョン識別子です。たとえば、us-phoenix-1です。

    例:

    fn update context api-url https://functions.us-phoenix-1.oci.oraclecloud.com
  6. 次を入力して、OCIファンクションで使用するDockerレジストリ(Oracle Cloud Infrastructure Registryなど)のアドレスを含む新しいコンテキストを構成します:

    fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix>

    ここでは:

    • <region-key>は、Oracle Cloud Infrastructure Registryリージョンのキーです。たとえば、Phoenixの場合はphxです。リージョン別の可用性を参照してください。

      指定したDockerレジストリは、ファンクションを実行する対象のサブネットと同じリージョンにあることをお薦めします。

    • <tenancy-namespace>は、リポジトリを作成するテナンシの自動生成されたオブジェクト・ストレージ・ネームスペース文字列(「テナンシ情報」ページに表示)です。たとえば、acme-devテナンシのネームスペースは、ansh81vru1zpである可能性があります。一部の古いテナンシでは、ネームスペース文字列が、すべて小文字のテナンシ名(たとえば、acme-dev)と同じ場合があることに注意してください。
    • <repo-name-prefix>は、ファンクション・イメージをプッシュするリポジトリの名前を指定するために、デプロイするファンクションの名前にプリペンドするリポジトリ名接頭辞です(オプション)。リポジトリ名の接頭辞を使用すると、レジストリ内のリポジトリへのアクセスを整理および制御しやすくなります。リポジトリ名およびリポジトリ名の接頭辞に関するノートを参照してください。

    例:

    fn update context registry phx.ocir.io/ansh81vru1zp/acme-repo
  7. (オプション)次のように入力して、OCIファンクションがファンクション・イメージをプッシュおよびプルするリポジトリのコンパートメントのOCIDを使用して、新しいコンテキストを構成します:

    fn update context oracle.image-compartment-id <compartment-ocid>

    例:

    fn update context oracle.image-compartment-id ocid1.compartment.oc1..aaaaaaaaquqe______z2q
    

    oracle.image-compartment-idの値を指定しない場合、OCI関数はルート・コンパートメント内のリポジトリに対してイメージをプッシュおよびプルします。どちらの場合も、コンパートメント内のリポジトリ(oracle.image-compartment-idで指定されたコンパートメントまたはルート・コンパートメント)を管理できるように、適切なポリシー・ステートメントが存在する必要があります。OCIファンクション・ユーザーにOracle Cloud Infrastructure Registryリポジトリへのアクセス権を付与するためのポリシー・ステートメントを参照してください。

    OCI Functionsは、ファンクション名にリポジトリ名の接頭辞を事前に付加することで、ファンクション・イメージのリポジトリ名を構成します。リポジトリ名は、テナンシ全体のすべてのコンパートメント間で一意です。名前付きリポジトリにイメージをプッシュする場合、OCI関数はコンパートメントおよびoracle.image-compartment-idに関して次のように動作します。

    • その名前のリポジトリがoracle.image-compartment-idで指定されたコンパートメントにすでに存在する場合、OCI Functionsはそのリポジトリにイメージを正常にプッシュします。
    • その名前のリポジトリがテナンシのコンパートメント(ルート・コンパートメントを含む)に存在しない場合、OCIファンクションは、oracle.image-compartment-idで指定されたコンパートメントにその名前の新しいリポジトリを作成し、イメージをそれに正常にプッシュします。
    • その名前のリポジトリがテナンシにすでに存在し、oracle.image-compartment-idで指定されたリポジトリとは異なるコンパートメントに存在する場合、OCIファンクションはエラーを発行します。OCIファンクションがイメージを正常にプッシュするには、oracle.image-compartment-idを既存のリポジトリのコンパートメントのOCIDに設定するか、(ファンクションの名前を変更するか、または代替リポジトリ名の接頭辞を指定して)別のリポジトリ名を指定する必要があります。
  8. (オプション)コンテキスト・ファイルを表示して、作成したFn ProjectのCLIコンテキストを確認します。たとえば、次のように入力します:

    more ~/.fn/contexts/johns-oci-context.yaml

    コンテキスト・ファイルには次が含まれます。

    api-url: https://functions.us-phoenix-1.oci.oraclecloud.com
    provider: oracle
    registry: phx.ocir.io/ansh81vru1zp/acme-repo
    oracle.image-compartment-id: <compartment-ocid>

このトピックのステップを完了したら、oracle.profileパラメータを使用したFn ProjectのCLIコンテキストの設定に進みます。

リポジトリ名およびリポジトリ名の接頭辞に関するノート

ファンクションをデプロイすると、ファンクション・イメージは、Fn ProjectのCLIコンテキストのregistry:設定で指定されたレジストリ内のリポジトリにプッシュされます。リポジトリの名前は、ファンクションの名前(<function-name>)と同じか、リポジトリ名の接頭辞が付いたファンクションの名前(<repo-name-prefix>/<function-name>)のいずれかです。

関数をデプロイする場合は、次の点に注意してください。<function-name>という名前のリポジトリ(<repo-name-prefix>を指定した場合は<repo-name-prefix>/<function-name>)がまだレジストリに存在しない場合:

  • レジストリの「ルート・コンパートメントの最初のプッシュ時にリポジトリを作成」プロパティがtrueに設定されている場合、新しいプライベート・リポジトリがルート・コンパートメントに作成されます
  • レジストリの「ルート・コンパートメントの最初のプッシュでのリポジトリの作成」プロパティがfalseに設定されている場合、新しいリポジトリは作成できず、ファンクション・イメージのプッシュの試行は失敗します。

レジストリの「ルート・コンパートメントの最初のプッシュでのリポジトリの作成」プロパティがfalseに設定されており、適切なリポジトリがまだ存在しない場合は、ファンクションをデプロイする前に次のいずれかを実行します:

  • ファンクションと同じ名前の新しいリポジトリを作成し、Fn ProjectのCLIコンテキストで<repo-name-prefix>を指定しないでください。たとえば、ファンクションの名前がhello-worldの場合は、hello-worldという名前の新しいリポジトリを作成します。
  • 既存のリポジトリと同じ名前のファンクションを作成し、Fn ProjectのCLIコンテキストで<repo-name-prefix>を指定しないでください。たとえば、既存のリポジトリがhello-galaxyという名前の場合は、新しい関数 hello-galaxyという名前を付けます。
  • リポジトリ名の接頭辞を使用してリポジトリへのアクセスを整理および制御する場合は、Fn ProjectのCLIコンテキストで<repo-name-prefix>を指定し、リポジトリ名の接頭辞とファンクション名の両方を含む名前のリポジトリも作成します。たとえば、hello-worldという名前のファンクションのイメージをacme-repo/hello-worldという名前のリポジトリに格納するには、Fn ProjectのCLIコンテキストでphx.ocir.io/ansh81vru1zp/acme-repoを指定し、acme-repo/hello-worldという名前のリポジトリも作成します。