はじめに
先日開催した Oracle Cloud Hangout Cafe 「ワークフローツールで楽々Job管理」 の Q&A コーナーで 「Argo Workflows の artifacts に OCI Object Storage は使えますか?」という質問がありました。Oracle Cloud Infrastructure (OCI) の Object Storage は S3 互換 API を提供していますので、当然回答は「はい、使えますよ、S3 互換 API 使って下さい」になった訳ですが、ここでは実際にこれをやってみたいと思います。
OCI S3 互換 API の概要については、こちらの資料「 OCIオブジェクト・ストレージ - S3互換APIの利用」を参照して下さい。
尚、Argo Workflows は 既にセットアップされていて、"argo" ネームスペースでワークフローが実行できるようになっている前提で話を進めます。
OCI Object Storage バケットを作成する
S3 互換 API でアクセスできる OCI のコンパートメントは仕様上ただ1つです。
「管理 > テナンシ詳細」で、どのコンパートメントが利用可能か確認(若しくは指定)して、そのコンパートメント内に Argo Workflows が使うバケットを作成して下さい。
同時にオブジェクト・ストレージ・ネームスペースも確認しておいてください。
顧客秘密キーを生成する
S3 互換 API の認証情報になります。
OCI コンソールから認証に使うユーザーの「アイデンティティ > ユーザー > ユーザーの詳細 > 顧客秘密キー」をたどって、新しい顧客秘密キーを生成します。秘密キーは生成された時にしかコピーするチャンスが無いので注意。
アクセス・キーと秘密キーをメモします。
Secret を作成する
生成した顧客秘密キーを使って Secret を作成します。
kubectl create secret -n argo generic oci-os-s3-cred \
--from-literal=accesskey=<アクセス・キー値> \
--from-literal=secretkey=<秘密キーの値>
ConfigMap を作成する
以下のような ConfigMap を作成します。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: argo
name: artifact-repositories
annotations:
workflows.argoproj.io/default-artifact-repository: oci-artifact-repository
data:
oci-artifact-repository: |
s3:
bucket: argo-artifacts
endpoint: somens.compat.objectstorage.ap-tokyo-1.oraclecloud.com
region: ap-tokyo-1
accessKeySecret:
name: oci-os-s3-cred
key: accesskey
secretKeySecret:
name: oci-os-s3-cred
key: secretkey
ポイントは、以下のとおり
- metadata.name が "artifact-repositories" だと、これがデフォルトの artifact repository になるので、ワークフロー定義でいちいち指定する必要が無くなります。
- data には複数のエントリーが書けますが、metadata.annotations.workflows.argoproj.io/default-artifact-repository でデフォルトのエントリーを指定できます。
- s3.endpoint は S3互換APIのルールに従ったURLを指定します。
<ネームスペース>.compat.objectstorage.<リージョン>.oraclecloud.com - s3.region は ホームリージョン以外のリージョンのバケットを使用する場合必須です。
ワークフローを実行する
Github にある example を実行してみます。
argo submit -n argo https://raw.githubusercontent.com/argoproj/argo-workflows/master/examples/artifact-passing.yaml
内容はこのようなもの。
# This example demonstrates the ability to pass artifacts
# from one step to the next.
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: artifact-passing-
spec:
entrypoint: artifact-example
templates:
- name: artifact-example
steps:
- - name: generate-artifact
template: whalesay
- - name: consume-artifact
template: print-message
arguments:
artifacts:
- name: message
from: "{{steps.generate-artifact.outputs.artifacts.hello-art}}"
- name: whalesay
container:
image: docker/whalesay:latest
command: [sh, -c]
args: ["sleep 1; cowsay hello world | tee /tmp/hello_world.txt"]
outputs:
artifacts:
- name: hello-art
path: /tmp/hello_world.txt
- name: print-message
inputs:
artifacts:
- name: message
path: /tmp/message
container:
image: alpine:latest
command: [sh, -c]
args: ["cat /tmp/message"]
実行できました。
Object Storage のバケットを見てみましょう。
ファイル (hello-art.tgz) が作成されていますね。
(おしまい)
参考情報
https://docs.oracle.com/ja-jp/iaas/Content/Object/Tasks/s3compatibleapi.htm
https://argoproj.github.io/argo-workflows/walk-through/artifacts/
https://argoproj.github.io/argo-workflows/configure-artifact-repository/