はじめに
実は私、こんな本のサーバレス編担当者でした。
- AWS経験者が秒で理解する Oracle Cloud 爆速構築バイブル
https://techbookfest.org/product/7Sqh0FMVKnEwshbAr7NjTq?productVariantID=qnq8zEc2VdQ8AcbCRvjNNS
担当者になるまでほとんど業務で触ったことありましぇんでした。
で、執筆の時に困ったのが
OCI Functions をローカルから触ろうとすると、
「これってさっき作ったキーとどう違うの?」「え、また認証するの?」という、認証について一文字も書けないスランプ状況になりました。
これ、私以外も皆さん思いませんでした??(圧)
・・・・ってことでこれを分かりやすく整理します。
【1分クッキング】OCI Functions アプリケーションのつくりかた
1. VCNの作成
※VCNは作成手順はこちらを見て30秒で作ってください。(マジで30秒)
https://oracle-japan.github.io/ocitutorials/beginners/creating-vcn/
2. OCI Functionsアプリケーションの作成
開発者サービス>Function>アプリケーションの作成画面に遷移し、アプリケーションの作成ボタンを押します。
今回は以下のように設定しました。
- アプリケーション名:sasafanc(任意)
- コンパートメント:ご自身のコンパートメントを選択
- VCN:事前に作成したVCN
- サブネット:今回はパブリック(任意)
- シェイプ:GENERIC_X86
はい、2秒でActiveになります。
これでFunctionsの"⼊れ物"となるアプリケーションを作成しました!(ETA 1分)
問題はここからや
今回はCloud Shellを脱却し、ローカルで開発します。
かれこれ、3年間エンジニアとして働いているのでまあ余裕でしょう・・・!
作成したアプリケーション名を押し、詳細画面の左下にローカル設定ガイド詳細を押します。
長いッッッッッツ!!!!怒(図1)
しかもさりげなく、一番めんどくさそうなところが終わったことになってるな?????(図2)
実際、手順としては難しくなく基本的には図1,図2の手順をコピペしていけば終わりますが・・・・
どこで何を認証してるのか全く分からん!!! となったので整理します。(Docker loginとかConfigとかAPI署名キーとかDocker loginとか)
【2時間59分クッキング】本題に入ります
OCI Functionsを動かすには、2つの異なる認証が必要なんです。なんでや!!
結論から言うと、デプロイから実行までの3つのフェーズで、それぞれ下記の認証が使われます。
- ①イメージのビルド&Push → Auth Token
- ②Functionの作成 → API署名キー
-
③関数の実行 → API署名キー
なるほどわからん。それぞれガッツリ見ていきましょう!
①User → OCIR(イメージのビルド&Push)
何のため?
- ローカル環境でFunctionをコンテナイメージとしてビルド
- ビルドしたイメージをOCIR(Oracle Container Registry)にPush
- Dockerイメージを作ってOCIR保管するフェーズ
使うもの:
- Auth Token (パスワードみたいなもの)
- Fn CLI + Docker(またはPodmanなどの互換ツール)
なんでAuth Tokenが必要なの?
OCIRはコンテナレジストリなので、ユーザー名+パスワードを使います。
API署名キーはDocker loginと互換性がないので、パスワード的なもの(Auth Token)が必要になります。
どうやって?
- OCIコンソールの「ユーザー設定 → 認証トークン」でトークン作成
- 右上のユーザーアイコンをクリック
- 「ユーザー設定」を選択
- 左側メニューの「認証トークン」をクリック
- 「トークンの生成」ボタンをクリック
- 説明欄に「OCIR用」とか入力(後で何のトークンか分かるように)
- 表示されたトークンをコピー
- 一度閉じると二度と見られません
- 私はコピーを忘れて作り直しました(泣)
-
docker loginでOCIRにログイン- ユーザー名:
<テナンシー名>/<ユーザー名> - パスワード: さっきコピーしたAuth Token
- ユーザー名:
コマンド例:
# OCIRにログイン(Auth Token使用)
docker login nrt.ocir.io -u 'my-tenancy/oracleidentitycloudservice/taro@example.com' -p '<Auth Token>'
# ログイン成功!
# Login Succeeded
ユーザー名の形式に注意!
-
テナンシー名は「Object Storageのネームスペース」と同じ
-
図1「ローカル設定ガイド」に書いてある形式をコピーするのが確実
Login Succeeded って出たら優勝です。
②User → Functions(Functionの作成)
何のため?
-
fn deployコマンドでFunctionを作成・更新 - Functionsに「OCIRのどのイメージを使うか」を伝える
使うもの
- API署名キー(OCI Config)
-
~/.oci/config(設定ファイル)
なんでAPI署名キーが必要なの?
Functionの作成・更新は「OCI APIを操作する」ことになります。
OCIのリソース(Functions、Network、Storageなど)を安全に操作するために、API署名キー認証が使われます。
どうやって?
-
oci setup configコマンドで~/.oci/configを作成- リージョンはどこ?(例:ap-tokyo-1)
- ユーザーのOCIDは?(OCIコンソールで確認)
- テナンシーのOCIDは?(これもコンソールで確認)
- 鍵ペアが自動生成される
- 秘密鍵:
~/.oci/oci_api_key.pem - 公開鍵:
~/.oci/oci_api_key_public.pem
- 秘密鍵:
- OCIコンソールの「ユーザー設定 → APIキー」に公開鍵を貼り付け
-
cat ~/.oci/oci_api_key_public.pemで内容を表示してコピペ - フィンガープリントが表示されるので、
~/.oci/configのものと一致してるか確認
-
-
fn deployコマンドを実行
コマンド例:
# Functionを作成・更新(API署名キー使用)
fn deploy --app myapp
OCI Configには何が書かれてる?
~/.oci/configには以下の情報が保存されます
- user: ユーザーOCID
- tenancy: テナンシーのOCID
- region: リージョン(例:ap-tokyo-1)
- key_file: 秘密鍵のパス
- fingerprint: 公開鍵のフィンガープリント
動作確認:
oci os ns get
Namespaceが取得できたら成功しています。またもや優勝です。
③User → Functions(関数の実行指示)
何のため?
-
fn invokeコマンドで関数を実行 - 実行指示を受けたFunctionsが、OCIRから該当イメージを取得してサーバーレス環境上で起動
使うもの:
- API署名キー(OCI Config)
なんでまたAPI署名キーが必要なの?
関数の実行指示も「OCI APIを操作する」ことになります。
「この関数を実行してください」というリクエストをOCI APIに送るので、ここでもAPI署名キー認証が使われます。
どうやって?(一例)
# 関数を実行(API署名キー使用)
echo '{"name":"World"}' | fn invoke myapp hello
# レスポンスが返ってくる
{"message":"Hello World"}
Functionsが裏側でやってること
- あなたのAPI署名キーで実行指示を認証
- OCIRから指定イメージを取得
- サーバーレス環境でコンテナを起動
- リクエストを処理
- レスポンスを返す
まとめ:結局なにがなんなの?
①User → OCIR:イメージのビルド&Push
- ローカル環境でFn CLIとDockerを使ってFunctionをコンテナイメージとしてビルド
- ビルドしたイメージをOCIR(Oracle Container Registry)にPush
- 使う認証:Auth Token - OCIRへのログイン専用の資格情報(Dockerのパスワード代わり)
②User → Functions:Functionの作成
-
fn deployコマンドでFunctionを作成・更新 - Functionsに「OCIRのどのイメージを使うか」を伝える
- 使う認証:API署名キー(OCI Config) - OCI APIを操作するための認証情報
③User → Functions:関数の実行指示
-
fn invokeコマンドで関数を実行 - 実行指示を受けたFunctionsが、OCIRから該当イメージを取得してサーバーレス環境上で起動
- 使う認証:API署名キー(OCI Config) - OCI APIを操作するための認証情報
このフローの中で、2つの認証(Auth TokenとAPI署名キー)が両方使われてるのが分かりますね。
だから両方必要なんですね~。
・・・・
・・・・
1つにしてくれ。PCの顔認証と同じにしてくれ。




