- Compute, OCI Functions を実行するために必要なポリシーや仮想ネットワーク(VCN)が作成済みであること
- Cloud Shell が使用可能な環境であること
- 未実施の場合は、Oracle Cloud Infrastructure ドキュメント - クラウド・シェルを参考に、必要なポリシー等を設定してください
- Cloud Shell/OCI Functions の CPU アーキテクチャは、X86 で統一すること
- 各種ツール、言語、ライブラリのバージョンは、Cloud Shell に事前にインストールされているものに従います
- OCI CLI: 3.38.0
- Fn Project: 0.6.29
- Python: 3.8.13
- SDK for Python: 2.125.0
ハンズオンを実施するにあたり、本リポジトリを Cloud Shell 上にクローンします。
git clone https://github.com/sh-sho/function_auth.gitリポジトリは以下のような構成です。
$ tree function_auth/
function_auth/
├── README.md
└── sample-auth-func
├── func.py
├── func.yaml
└── requirements.txt
1 directory, 4 filesOCI ConsoleからOCI Vaultsを作成します。ハンバーガーメニュー > アイデンティティとセキュリティ > キー管理とシークレット管理 > ボールト を選択します。
次にKeyを作成します。
先ほど作成したボールトを選択します

キーの作成をクリックし以下を参考に必要な項目を埋めてマスター暗号化キーを作成します。

次にSecretを作成します。シークレットを使うことでユーザー名やバスワードなどを、先ほど作成したマスター暗号化キーを使って暗号化して管理ができます。

シークレットの作成をクリックし必要な項目を埋めてシークレットを作成します。

作成したシークレットのOCIDを確認します。
シークレットのOCIDをコピーします。この値は後で使用します。

OCI Consoleから、OCI Functions の実行環境を作成します。ハンバーガーメニュー > 開発者サービス > ファンクション > アプリケーションをクリックします。
アプリケーションの作成をクリックします。
以下のように入力し、アプリケーションを作成します。
- 名前: sample-auth-app-<ご自身の名前等>
- VCN: 作成済みの VCN
- サブネット: 作成済み VCN に含まれるパブリック・サブネット
- シェイプ: GENERIC_X86
アプリケーションの作成が完了したら、Cloud Shellを再度開いて、以下のように実行します。
fn list context実行結果
CURRENT NAME PROVIDER API URL REGISTRY
ap-tokyo-1 oracle-ip https://functions.ap-tokyo-1.oci.oraclecloud.com nrt.ocir.io/orasejapan/sobata
* default default http://localhost:8080ハンズオンで使用するリージョンを選択します。
fn use context ap-tokyo-1実行結果
Now using context: ap-tokyo-1使用するコンテキストを更新します。
COMPARTMENT_ID=<使用するコンパートメントID>
fn update context oracle.compartment-id $COMPARTMENT_ID実行結果
Current context updated oracle.compartment-id with ocid1.compartment.oc1..aaaaaxxxxハンズオンで使用するコンテナ・レジストリ(OCIR)のベースパスをコンテキストに設定するために、テナンシーの namespace を取得します。OCI Console 右上の人型アイコンからテナンシをクリックします。
テナンシの詳細画面から、オブジェクト・ストレージ・ネームスペースをコピーします。
後述の手順のために、変数に格納しておきます。
NAMESPACE="<namespace>"ハンズオンで使用するコンテナ・レジストリ(OCIR)のベースパスをコンテキストに設定します。 ここでの、任意の名前はハンズオン環境内で一意となるように設定してください。
fn update context registry nrt.ocir.io/${NAMESPACE}/<任意の名前>実行結果例(環境によって実行結果は異なります)
Current context updated registry with nrt.ocir.io/<namespace>/<任意の名前>ここで、今までの設定事項を確認してみます。
fn inspect context実行結果例(環境によって実行結果は異なります)
Current context: ap-tokyo-1
api-url: https://functions.ap-tokyo-1.oci.oraclecloud.com
oracle.compartment-id: <ハンズオンで使用するコンパートメントID>
provider: oracle-cs
registry: nrt.ocir.io/<namespace>/sobata以下のようなFunction コードを実行します。
import io
import oci
import base64
import json
import logging
from fdk import response
# 1
signer = oci.auth.signers.get_resource_principals_signer()
client = oci.secrets.SecretsClient({}, signer=signer)
# 2
def get_text_secret(secret_ocid):
get_secret = client.get_secret_bundle(secret_ocid).data.secret_bundle_content.content.encode('utf-8')
decrypt_secret = base64.b64decode(get_secret).decode("utf-8")
logging.getLogger().info(get_secret)
return {"secret content": decrypt_secret}
def handler(ctx, data: io.BytesIO = None):
logging.getLogger().info("function start")
secret_ocid = secret_type = ""
try:
cfg = dict(ctx.Config()) # ... 3
secret_ocid = cfg["secret_ocid"]
logging.getLogger().info("Secret ocid = " + secret_ocid)
except Exception as e:
print('ERROR: Missing configuration keys, secret ocid', e, flush=True)
raise
secret_text = get_text_secret(secret_ocid) # ... 4
logging.getLogger().debug("secret detail")
logging.getLogger().debug(secret_text)
logging.getLogger().debug("Inside Python Hello World function")
return response.Response(
ctx, response_data=secret_text,
headers={"Content-Type": "application/json"}
)
コードを説明します。
- OCI FunctionsからほかのOCIリソース (OCI Vault) のAPIを実行するための認証・認可の処理です。
- OCI VaultのSecretを取得する関数です。SecretのOCIDをもとに、Secretを取得しています。SecretはBase64エンコードされているため、デコードしています。
- FunctionsのConfigurationから
secret_ocidをkeyに持つ値を取得しています。 secret_ocidをget_text_secret関数に渡し、Secretを取得します。
OCIR にログインするための資格情報を取得します。OCI Console 右上の人型アイコンをクリックし、自身のユーザー名(メールアドレス)が表示されている項目をクリックします。
ユーザーの詳細画面に表示されているユーザー名 (以下、図中では oracleidentitycloudservice/sho.obata@oracle.com) を以下のように変数に設定します。
DOCKER_USERNAME="${NAMESPACE}/<コピーしたユーザー名>"ユーザーの詳細画面に表示されている認証トークンをクリックします。
トークンの生成をクリックします。

認証トークンを生成します。生成された認証トークンをコピーし、以下のように変数に設定します。
DOCKER_PASSWORD="<コピーした認証トークン>"以下のように、実行し OCIR へログインしておきます。
docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD nrt.ocir.io
実行結果
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded次にFunctionのConfigurationを設定します。func.yamlファイルにsecretのOCID のキーと値のペアを設定します。
secret_ocidはシークレットの作成でコピーしたシークレットのOCIDを記入します。
cd ~/function_auth/sample-auth-func/func.yaml
schema_version: 20180708
name: sample-auth-func
version: 0.0.8
runtime: python
build_image: fnproject/python:3.11-dev
run_image: fnproject/python:3.11
entrypoint: /python/bin/fdk /function/func.py handler
memory: 256
config:
secret_ocid: ocid1.vaultsecret.oc1.ap-tokyo-1.amaaaxxxx # 作成したsecretのocid作成したアプリケーションに Function コードをデプロイします。
cd function_auth/sample-auth-func
fn deploy -v --no-bump --app sample-auth-app-<ご自身の名前等>実行結果
1094a795a2ef: Pushed
3a41fdf53716: Pushed
e1f042f0f0b2: Pushed
cffcdefe4259: Pushed
08a2edef96b9: Pushed
e0f4a6983934: Pushed
8b4d3bacf0d7: Pushed
0.0.8: digest: sha256:59c54085e161b7ba7e3db2168278a6de4ac2b5679eca819e6252ebbc46573791 size: 1782
Updating function sample-auth-func using image nrt.ocir.io/<namespace>/sobata/sample-auth-func:0.0.8...
Successfully created function: sample-auth-func with nrt.ocir.io/<namespace>/sobata/sample-auth-func:0.0.8作成したFunctionを実行します。
$ fn invoke sample-auth-app sample-auth-func実行結果例
{'secret content': 'sample_secret_contents'}OCI VaultのSecretから値が取得できていることを確認します。











