Skip to content

Latest commit

 

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

OCI Vault Hands-on

前提条件

  • 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

ハンズオン全体像

alt text

事前準備

ハンズオンで使うコードのクローン

ハンズオンを実施するにあたり、本リポジトリを 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 files

OCI Vaultのハンズオン

OCI Vaultの作成

OCI ConsoleからOCI Vaultsを作成します。ハンバーガーメニュー > アイデンティティとセキュリティ > キー管理とシークレット管理 > ボールト を選択します。

alt text

次にボールトの作成をクリックします。 alt text

ボールトの名前を入力し作成します。 alt text

Master Encryption Keysの作成

次にKeyを作成します。 先ほど作成したボールトを選択します alt text

マスター暗号化キーを作成します。 alt text

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

Secretの作成

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

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

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

OCI Functionsの作成

アプリケーションの作成

OCI Consoleから、OCI Functions の実行環境を作成します。ハンバーガーメニュー > 開発者サービス > ファンクション > アプリケーションをクリックします。

alt text

アプリケーションの作成をクリックします。

alt text

以下のように入力し、アプリケーションを作成します。

  • 名前: sample-auth-app-<ご自身の名前等>
  • VCN: 作成済みの VCN
  • サブネット: 作成済み VCN に含まれるパブリック・サブネット
  • シェイプ: GENERIC_X86

alt text

コンテキストの更新

アプリケーションの作成が完了したら、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 右上の人型アイコンからテナンシをクリックします。

alt text

テナンシの詳細画面から、オブジェクト・ストレージ・ネームスペースをコピーします。

alt text

後述の手順のために、変数に格納しておきます。

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 の実行

Function コードの説明

以下のような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"}
    )

コードを説明します。

  1. OCI FunctionsからほかのOCIリソース (OCI Vault) のAPIを実行するための認証・認可の処理です。
  2. OCI VaultのSecretを取得する関数です。SecretのOCIDをもとに、Secretを取得しています。SecretはBase64エンコードされているため、デコードしています。
  3. FunctionsのConfigurationからsecret_ocidをkeyに持つ値を取得しています。
  4. secret_ocidget_text_secret関数に渡し、Secretを取得します。

OCIR にログインするための資格情報を取得する

OCIR にログインするための資格情報を取得します。OCI Console 右上の人型アイコンをクリックし、自身のユーザー名(メールアドレス)が表示されている項目をクリックします。

alt text

ユーザーの詳細画面に表示されているユーザー名 (以下、図中では oracleidentitycloudservice/sho.obata@oracle.com) を以下のように変数に設定します。

alt text

DOCKER_USERNAME="${NAMESPACE}/<コピーしたユーザー名>"

ユーザーの詳細画面に表示されている認証トークンをクリックします。 トークンの生成をクリックします。 alt text

認証トークンを生成します。生成された認証トークンをコピーし、以下のように変数に設定します。

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の設定

次に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 のデプロイ

作成したアプリケーションに 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 を用いてSecretを取得

作成したFunctionを実行します。

$ fn invoke sample-auth-app sample-auth-func

実行結果例

{'secret content': 'sample_secret_contents'}

OCI VaultのSecretから値が取得できていることを確認します。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages