Argo Workflows の artifacts に Oracle Cloud Infrastructure (OCI) Object Storage を使う

# はじめに

先日開催した Oracle Cloud Hangout Cafe  [「ワークフローツールで楽々Job管理」](https://ochacafe.connpass.com/event/260559/) の Q&A コーナーで 「Argo Workflows の artifacts に OCI Object Storage は使えますか？」という質問がありました。Oracle Cloud Infrastructure (OCI) の Object Storage は S3 互換 API を提供していますので、当然回答は「はい、使えますよ、S3 互換 API 使って下さい」になった訳ですが、ここでは実際にこれをやってみたいと思います。

OCI S3 互換 API の概要については、こちらの資料「 [OCIオブジェクト・ストレージ - S3互換APIの利用](https://speakerdeck.com/oracle4engineer/ociobuziekutosutorezi-s3hu-huan-apifalseli-yong)」を参照して下さい。

尚、Argo Workflows は 既にセットアップされていて、"argo" ネームスペースでワークフローが実行できるようになっている前提で話を進めます。

# OCI Object Storage バケットを作成する

S3 互換 API でアクセスできる OCI のコンパートメントは仕様上ただ1つです。
「管理 > テナンシ詳細」で、どのコンパートメントが利用可能か確認（若しくは指定）して、そのコンパートメント内に Argo Workflows が使うバケットを作成して下さい。
同時にオブジェクト・ストレージ・ネームスペースも確認しておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/263cb4ca-59ea-dfed-cdae-06f764b0c5fc.png)

# 顧客秘密キーを生成する

S3 互換 API の認証情報になります。
OCI コンソールから認証に使うユーザーの「アイデンティティ > ユーザー > ユーザーの詳細 > 顧客秘密キー」をたどって、新しい顧客秘密キーを生成します。秘密キーは生成された時にしかコピーするチャンスが無いので注意。
アクセス・キーと秘密キーをメモします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/00336b6c-67f3-7445-42d2-799237d20f58.png)

# 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"]
```

実行できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/ac2eccb3-65fa-d249-9810-d444c2f8b921.png)

Object Storage のバケットを見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/6564f7c1-e960-2ef7-349c-4a7fb97bc271.png)

ファイル (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/