AlibabaCloud FunctionComputeでRDSインサート

こんにちは。ひつじです。

AlibabaCloudのFaasサービスのFunctionComputeでRDSインサートをやってみました。
各メガクラウドでのFaasサービスは以下の通りです。AWS Lambdaとかは有名ですよね。

|AWS|Azure|GCP|Alibaba|
|---|---|---|---|
|AWS Lambda|Azure Functions|Cloud Functions|Function Compute|



# ゴール
Function Computeで1分間隔でRDSにインサートを実行する



#サービスの作成

FunctionComputeで最初にやることはサービスの作成です。
今回は何も考えずにデフォルトで作成しますが、VPCに所属させたり、他のプロダクトへのアクセス権限を細かく設定したり、ログサービスと連携させたり設定ができます。

このサービスという定義の中に複数の関数を登録できます。

![スクリーンショット 2019-07-30 14.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/db7df4c3-7852-3e16-646f-166771a414b6.png)

![スクリーンショット 2019-07-30 14.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/62694eaa-76f5-61a8-846c-40853e92ff18.png)

#関数の作成
ここから実際にプログラムの作成工程に入ります。
今回は、以下の仕様で作成していきたいと思います。

・1分に１回起動するプログラムとする。
・ランタイムはPython2.7とする。
・pymysqlライブラリを利用しRDSにアクセスする。


##関数テンプレート

今回は空の関数を使います。

![スクリーンショット 2019-07-30 14.45.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/00c50db9-0dbb-e444-0211-09794bd48f3a.png)

##トリガーの設定
今回はトリガータイプを「タイムトリガー」にします。
トリガー名を任意で入力、間隔を「１」に設定します。
こうすることで1分間隔でプログラムが実行されます。

![スクリーンショット 2019-07-30 14.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/ccd3ca07-5a13-87ef-df91-dcf50c67af9f.png)

##関数の設定

ここで実際のプログラムを記述できます。
今回はpymysqlライブラリを利用するため、コード設定の「Zipファイルのアップロード」からpymysqlライブラリをアップロードしましょう。

![スクリーンショット 2019-07-30 14.55.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/ac3876e0-e1fa-c085-4f4a-ebbdc8639be2.png)

その後、「オンライン編集」にてRDSへのインサートの処理を記述していきます。

```py
# -*- coding: utf-8 -*-
import logging
import json
import time
import re
from aliyun.log.logitem import LogItem
from aliyun.log.logclient import LogClient
from aliyun.log.getlogsrequest import GetLogsRequest
from aliyun.log.putlogsrequest import PutLogsRequest
from aliyun.log.listlogstoresrequest import ListLogstoresRequest
from aliyun.log.gethistogramsrequest import GetHistogramsRequest
from datetime import datetime
import pymysql.cursors

nowstr=datetime.now().strftime("%Y/%m/%d %H:%M:%S")

connection = pymysql.connect(
           host='rm-e9bx176258xp97945xo.mysql.japan.rds.aliyuncs.com',
                       user='scsk_cho',
                       password='Pub12345',
                       db='pacro',
                       charset='utf8mb4',
                       cursorclass=pymysql.cursors.DictCursor)

def handler(event, context):
  logger = logging.getLogger()
  sql="insert into t_fc(name,date) values ('sheep','"+nowstr+"')"
  #表示テスト1
  logger.info(sql)
  try:
    with connection.cursor() as cursor:
    #表示テスト２
      print "print display test"
      cursor.execute(sql)
      connection.commit()  
  except:
    connection.rollback()  
  #表示テスト３
  return "return display test"


```

ここまで記述できたら手動で実行してみましょう。
![スクリーンショット 2019-07-30 15.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/1c3aba4f-fbd1-fe9e-fd4d-4e962364c23b.png)

#結果確認

Execution Result にて実行結果を確認していきます。
Execution Resultが表示されていない場合が、Viewタブから開きましょう。

*確認ポイント*
1. Status200であること
2. ResponseにてReturnで指定した引数が表示される
3. loger.infoで出力した文字列（今回SQL）が表示される
4. printで指定した文字列が表示される。

![スクリーンショット 2019-07-30 15.15.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/577f985f-87da-1e1c-ee97-f78acf01932d.png)


最後にRDSの中身をみてみましょう。

<img width="647" alt="スクリーンショット 2019-07-30 15.29.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/99c3ca44-a66d-2b97-5324-c2d9b2d7cc3c.png">


#最後に

いかがでしたでしょうか。
基本的なとこですが、なんとかうまくいきましたね。
それではご査収ください : )