Cloud Functionsから移行検討_Code Engine Jobsを使用して、ICOS バケットに新しいファイルが追加されるたびにファイル操作を自動化する

## IBM Cloud Use Caseの記事シリーズについて
お客様のUse Caseの中で、複数のIBM Cloudサービスを利用することが多いです。
このシリーズでは、個別のIBM Cloudサービスの紹介ではなく、Use Caseごとに技術情報を説明していきます。

## 今回のUse Caseとは

‐　**達成したいこと**
お客様のファイルはIBM Cloud上のObject Storage Bucketに保管しています。
新しいファイルがBucketにアップロードしたら、同じファイル操作を行いたいます。例えば、ファイル名にTimestampを追加したり、ファイルを別の場所に移動したりします。詳しい操作内容はPython Codeの内容に依存し、Use Caseの実現にはあまり影響がないです。

‐　**本来のやり方**

移行する前に、IBM Cloud上のCloud Functionsというサービスを利用されています。下記の図に示すように、Python CodeはCloud FunctionsのAction機能で実行され、実行のタイミングはCloud FunctionsのTrigger機能で管理されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/fd9b5edc-bb15-19e2-876b-a271875c579c.png)

ただし、IBM Cloud上のCloud Functionsサービスは今年(2023年)の年末でEnd of Marketingとなり、来年(2024年)の六月末にEnd of Supportとなります。Code Engineに移行することは検討されています。


‐　**現在のやり方**

先ずは、Code EngineのSubscription機能でICOS Bucketを監視して、変更があったらPython Codeの実行をトリガーすることができます。

次に、Code EngineでPython Codeを実行するために、Applications、Jobs、Functionsという３つの方法がありますが、このUse Caseに対して、Jobsが最適だと思います。なぜかというと：
‐　Applicationsは継続的なサービスとして24時間稼働するように設計されています。例えば、Web Serverを実行します。
‐　Code EngineのFunctionsはCloud Functionsにとても似でいるため、移行にはCode EngineのFunctionsが一番良いと自然に考える方もいるかもしれません。ただし、SubscriptionよりFunctionsをトリガーすることができません。
従って、Code EngineのJobsを使用することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/d332b24b-f5e8-0505-5fcf-bc407629cea7.png)

## Use Caseの実現 _ Jobsの作成

**設定の流れ**
1. Source Codeの準備
2. Code EngineのProjectを作成
3. Code EngineのJobsを作成

### 1. Source Codeの準備について、

Jobsを利用する際に、Cloud FunctionsのようにSource CodeをConsole画面でCopy‐Pasteすることができません。Code Repositoryに格納することが必要です。

そして、Source Codeには外部のPython libraryやPackageをImportすることがある場合、依存関係の説明が必要です。具体的に、Python Main()は__main__.py という名前のファイルに配置され、依存関係はrequirements.txtという名前のファイルに記載することが必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/e2feff6e-766a-d814-b6d0-71a4b3ac5cd9.png)

依存関係について具体的な説明方法は、下記のスクショのようになります。つまり、それぞれの外部libraryやPackageのバージョンを記載することになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/90a0fb04-ba7a-82b2-add7-947bb5f44965.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/db008ec2-0f2c-615f-531b-62a8ddb7c2ad.png)

更に、Source CodeにはImportされたものはibm_boto3 であり、依存関係にはibm-cos-sdkと記載されることに気付いたかもしれません。 実は、IBM ICOSのPython Packageはibm-cos-sdkと呼ばれており、requirements.txtでibm_boto3のバージョンを指定すると、後のSource Code Build作業がFailedとなることをご注意いただければと思います。


### 2. Code EngineのProjectを作成

Projectの作成が簡単なので、手順とスクショを割愛して、Jobsの作成画面から説明いたします。

### 3. Code EngineのJobを作成

Python Codeから実行するため、Jobsの作成画面で**Container image**ではなく、**Source Code**を選択して、Github RepositoryのURLを入力します。次に、**Specify build details**をクリックして、Buildについて設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/d6194296-1b49-e358-b4f5-c61fd2b31225.png)

**Specify build details**に最初のステップは**Source**についての設定であり、入力すべきの内容は自分のRepo設定に依存します。私のSample Repositoryを公開していますので、**Access**情報は要りません。**Branch**がmainのままで、**Context directory**も入力せずに**Next**にいきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/26af2f22-3e4d-d88a-ae38-e3a71843ca3a.png)

次は**Strategy**の設定になります。私はDockerfileを用意していないので、ここでSource Codeから自動的にContainer ImageをBuildできる**Cloud Native Buildpack**を選択します。**Timeout**と**Build resources**がデフォルトのまま、**Next**にいきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/52aa8a03-1218-559b-e486-1f734a6dc4c1.png)

最後は**Output**のステップで、BuildできたContainer Imageの保管場所を設定することです。もちろんDockhubなどの外部Registryが利用可能ですし、IBM Cloud上の既存のPrivate Contrainer Registryも設定可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/034014be-9a37-cc3b-252e-a87c75ac5320.png)

他のJobsの設定を特に変更なしで、Jobsを作成します。Build作業が数分ぐらいの時間がかかります。
Jobsの状態がBuild completedに表示されたら、Jobsの作成が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/c3ded395-7476-07f3-1b2c-6b08d3217c98.png)


## Use Caseの実現 _ Subscriptionの作成

ICOS Bucketを監視して、新規ファイルが格納したら、先に作成したJobsを実行する機能はSubscriptionです。

ProjectのMain Menuに**Event subscription**をクリックして、右側の**Create** ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/6e30ba14-bc2a-40a6-cbc1-1bb6789a86c8.png)

現時点は、Subscriptionは定期的にTrigger、そして、ICOS Bucketの変更によりTrigger、Event StreamよりTrigger、３つのTrigger方法を提供しています。ここで**Cloud Object Storage**を選択して、Subscriptionの名前を入力して、**Next**に行きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/4b243529-ba55-cb40-5450-ef257d7dab50.png)

次の画面で、監視対象になるICOS Bucketを設定して、**Next**にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/7f255264-1dc7-55cf-70c2-f1662fdbeab9.png)

ここでTriggerの対象になり、先に作成したJobsに設定して、**Next**にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/9585c4cc-49e1-ca48-1dc1-561c6888bf33.png)

Summaryの画面で設定したことを確認して、**Create**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/10a22ec0-c20d-4acd-cbd5-898ca9950f49.png)

## Use Caseの実現 _ 効果を確認

では、対象である**testbucket-helen**とのICOS Bucketに**Book1.xls**ファイルをアップロードして、Jobsを実行されるかどうか、確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/76837626-e7b1-1b11-3a93-0c75ed1c4187.png)

アップロードしたら、Bucketの画面で2023-11-13 6:53 PMという操作の時間情報がわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/52a770b9-4a50-7d9c-b2e8-ac1ff3ff4828.png)

次にJobsの情報を確認しましょう。
Job runsというタブで、ファイルがアップロードしてから約一分後にJobsが正常に実行されたことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/6cc6fe13-9810-ff56-ea11-d625ceadcbcc.png)

そして、実行履歴**jobdefinition-b6-bmz7s**をクリックすると、実施した際にSubscriptionから来た情報、及び、当時Jobsの詳細設定が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/0046243e-5713-08ba-3900-53ade870d21b.png)

後は、右側のLaunch loggingでLog Analysisの画面でも実行情報を確認可能です。（多少遅延も出てます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2075462/69efdb31-3c8c-48b1-c46f-8e0bcfea2c5b.png)


## まとめて

このUse Caseを実現するため、主にCode Engineについての説明は、以上になります。

特に注意点として、
‐　Code EngineのFunctionsはSubscriptionよりTriggerすることは、現時点ではできないので、Jobsのご利用が必要
‐　Python Source CodeにImport xxxがある時に、依存関係を明確に記載することが必要
‐　ICOS Python Library ibm_boto3を利用すれば、依存関係にはPackageであるibm-cos-sdkのバージョンを説明必要

Code Engineの利用をご検討の際に、ご参考になれば幸いです。