IBM Cloud Functions を使って IBM Cloud Object Storage (ICOS) アップロードをメール通知する

# 概要
こんなイメージです。
ICOS に適当なファイルをアップロードをするだけでもよいですが、
せっかくなので Power Systems Virtual Server on IBM Cloud で Image Capture を取得して ICOS に Export する機能を使って動作することを確認します。

![Kobito.hqpRHK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/29d7214e-6f97-b351-2370-842a6e223ccc.png "Kobito.hqpRHK.png")

# 事前準備
CLI を使って準備を進めます。

## CLI プラグインインストール

```shell:

ibmcloud plugin install cloud-functions
ibmcloud plugin show cloud-functions
```

## CLI ログイン

```shell:

export SOURCE_REGION="us-east"
ibmcloud login -a cloud.ibm.com -r $SOURCE_REGION
```
## 環境設定

```shell:

export FN_NAMESPACE="khayama-fn-us-east"
export COS_INSTANCE_NAME="khayama-cos" # 既存の ICOS インスタンスを使います
```

## Functions Namespace 設定
`namespace` を作成してプロパティをセットします。

```shell:

ibmcloud fn namespace create $FN_NAMESPACE
ibmcloud fn namespace target $FN_NAMESPACE
```

## Functions から ICOS へのアクセスを許可
ICOS の変更通知を受信してトリガーできるように以下の許可設定をおこないます。

- [Using authorizations to grant access between services](https://cloud.ibm.com/docs/iam?topic=iam-serviceauth#auth-cli)

```shell:

ibmcloud iam authorization-policy-create \
functions \
--source-service-instance-name $FN_NAMESPACE \
cloud-object-storage \
--target-service-instance-name $COS_INSTANCE_NAME \
"Notifications Manager" 
```

## Email Delivery, powered by Sendgrid の無料プランを購入
こちらのサービスを使ってメールを送信します。
IaaS を有効化済みのアカウントをお持ちであれば、25000 通まで無料の「Free Package」を活用できます。

>Email Delivery, powered by Sendgrid - IBM Cloud : https://cloud.ibm.com/catalog/infrastructure/email-delivery	
![貼り付けた画像_2020_08_28_11_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e5bfd2de-6142-260a-c618-6c536366f20a.png "貼り付けた画像_2020_08_28_11_30.png")

## GitHub からダウンロード
GitHub にあるファイルをダウンロードします。

- [khayama/fn-sendEmailCosWrite](https://github.com/khayama/fn-sendEmailCosWrite)

```shell:

git clone https://github.com/khayama/fn-sendEmailCosWrite.git
cd fn-sendEmailCosWrite
```

今回の Functions デプロイ用 yaml では以下のように定義しています。
Functions 実行パラメータは、環境変数の値を取得して埋め込む形で定義しています。

```yaml:sendEmailCosWrite.yml

packages:
  sendEmailCosWrite:
    version: 1.0
    license: Apache-2.0
    actions:
      sendEmailCosWrite:
        version: 1.0
        description: sendEmail with SL_USER, SL_APIKEY when cos object write
        docker: openwhisk/dockerskeleton
        function: sendEmailCosWrite.sh
        inputs:
          SL_USER: $SL_USER
          SL_APIKEY: $SL_APIKEY
          TO: $TO
          FROM: 
                default: no-reply@ibmfunctions.com
          SUBJECT: 
                default: test subject
          BODY: 
                default: test body 1\ntest body 2\ntest body 3

    triggers:
      cosWrite:
        feed: /whisk.system/cos/changes
        inputs:
          bucket: $MY_BUCKET # The COS bucket must be regional and exist in the same location as the namespace
          event_types: write # https://cloud.ibm.com/docs/openwhisk?topic=openwhisk-pkg_obstorage#pkg_obstorage_ev_ch_ref_trig

    rules:
      sendEmail-cosWrite:
        description: Action is triggered by object-write operation
        action: sendEmailCosWrite
        trigger: cosWrite
```

# Functions デプロイ

## 環境変数セット
以下のように環境変数をセットします。

```shell:

export SL_USER="xxx"
export SL_APIKEY="xxx"
export TO="宛先メールアドレス"
export MY_BUCKET="khayama-power"
```

## yaml ファイルを指定してデプロイ

```shell:

ibmcloud fn deploy --manifest sendEmailCosWrite.yml 
# 削除するには ibmcloud fn undeploy --manifest sendEmailCosWrite.yml
```

# 動作確認

Power Systems Virtual Server on IBM Cloud で Image Capture を取得して ICOS に Export してみました。

>[Capturing and exporting a virtual machine (VM)](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-capturing-exporting-vm)
>
>![貼り付けた画像_2020_08_28_13_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/62329883-c52e-731d-be7d-95e46229341e.png)
>![貼り付けた画像_2020_08_27_16_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7395b491-37c2-80d2-e788-5a7f9f307cd7.png "貼り付けた画像_2020_08_27_16_30.png")

実際に ICOS にファイルアップロードをおこなわれ、Functions がトリガーされたかは以下の `Monitor` 画面で確認できます。

>https://cloud.ibm.com/functions/dashboard

>![貼り付けた画像_2020_08_27_16_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/fc795c9c-9244-ef37-b974-bd0004d693b1.png "貼り付けた画像_2020_08_27_16_33.png")


また、ICOS のバケットを見ても、以下のようにファイルの存在と最終変更日時について確認できます。

![貼り付けた画像_2020_08_27_16_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/b9ef4a2c-6589-b923-b6de-0fab61feb241.png "貼り付けた画像_2020_08_27_16_31.png")

このような形で無事設定された通知メールを受信できました。

![貼り付けた画像_2020_08_27_16_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/2e118b3b-daca-3e09-0998-e9330e427350.png "貼り付けた画像_2020_08_27_16_31.png")

# さいごに
これでICOSアップロードを自動でメール通知できたことが確認できました。
Power Systems Virtual Server on IBM Cloud のような Image Capture を取得して ICOS に Export するような機能で無事プロセスが完了したことを通知することに活用できると思います。

# 参考

- [IBM Cloud Functions を使って IBM Cloud Object Storage (ICOS) バケットをリージョン間でレプリケーションする - Qiita](https://qiita.com/khayama/items/d25b0266ee906d95c2f4#functions-namespace-%E8%A8%AD%E5%AE%9A)