AWSエンジニアが学習するAlibaba Cloud【Function Compute編 (2)】

普段AWSを主に利用しているエンジニアがAlibabaCloudを学習するために調べた情報や手順を紹介します。

今回の内容は

- Serverless Devsの概要
- Function Computeの実行(Serverless Devs)

となります。

## ■ Disclaimer

本記事は掲載時点の情報であり、最新の情報とは異なる場合があります。
本記事は完全性、正確性、有用性、安全性などを保証するものではありません。
本記事をご利用の場合は自己責任にてお願いします。

## ■ Prerequisites

- Alibaba Cloudアカウントを作成済みであることを前提とします。
  - [Alibaba Cloud アカウントを作成](https://www.alibabacloud.com/help/ja/maxcompute/latest/create-an-alibaba-cloud-account)
- [AWSエンジニアが学習するAlibaba Cloud【Function Compute編 (1)】](https://qiita.com/junk87/items/45de5da6bb6f6d6b57fb)を実施済みの環境であることを前提とします。

## ■ Overview

### 1. Serverless Devsの概要

![ServerlessDevs-image-00001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/500535b3-8886-3c12-24b5-e390303e4f81.png)


Serverless Devsは、強力なツールチェーンシステムを提供することに特化したオープンソースのサーバーレス開発者向けプラットフォームとなります。
AWS Serverless Application Model (AWS SAM) と似たプラットフォームとなりますが、マルチクラウドへのデプロイを前提としている為、Alibabaだけではなく他のクラウドへもデプロイが可能なのが特徴です。

#### 1-1. Serverless Devsの公式サイト

- serverless-devs.com
    - https://www.serverless-devs.com/index_en.html
- Github
    - https://github.com/serverless-devs/serverless-devs
- Docs
    - https://docs.serverless-devs.com/en/serverless-devs/readme

#### 1-2. Serverless Devsのライセンス

- Apacheライセンス2.0として提供[^1]

#### 1-3. Serverless Devsの歴史

- 2020年10月 Serverless開発者向けプラットフォーム「Serverless Devs」を正式にオープンソース化
- 2020年11月 Cloud Native Computing Foundation（CNCF）のLandscopeとして登録
- 2021年4月  Serverless Devs 2.0を正式リリース
- 2021年8月  Serverless Devsのダウンロード数が2万を突破

#### 1-4. Serverless Devsのコンセプト

- **OPEN SOURCE CONSTRUCTION**
    - 開発者が貢献できるオープンソースの構築
- **OPEN ECOLOGY**
    - npmやpypiと同様にオープンなエコシステムの考えを堅持
- **NO VENDOR LOCK**
    - マルチクラウドやマルチプロダクトベースのアプリケーション開発を支援

#### 1-5. Serverless Devsのメリット

![ServerlessDevs-image-00002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/3996a793-a72c-9a7d-aaec-158ef75a7a3f.png)

1. **Easy deployment**
    - マルチベンダーのプロジェクトやマルチクラウドのプロジェクトへ簡単にデプロイ
        - 製品サポート
            - Alibaba Cloud Function Compute
            - AWS Lambda
            - Baidu Cloud Function Compute（CFC）
            - HUAWEI CLOUD FunctionGraph
            - Tencent Cloud Serverless Cloud Function（SFC）
            - etc
2. **Open source development**
    - オープンソースコードを使用したオープンなエコシステムの中でプロジェクトを開発
3. **Pluggable features**
    - コンポーネントに関連するコマンドや機能をカスタマイズ可能
4. **Hands-on tutorials**
    - 多様なシナリオに適用可能な複数のハンズオンを提供
5. **Full lifecycle management**
    - 完全なライフサイクルでプロジェクト内のアプリケーションを管理
6. **Excellent integration**
    - プロジェクトと従来のエコシステムへの統合が可能
        - 例
            - GitHub Actionとの連携
            - Gitee Goとの連携
            - Jenkinsとの連携

#### 1-6. Serverless Devsのツールチェーンシステム

- Serverless Hub
    - コンポーネント、アプリケーション、ケースなどのリソースを提供
        - Docker Hubのようなもの
- Serverless Registry
    - コンポーネントやアプリケーションを管理したり、仕様モデルを提供
        - Pypiやnpmのエコシステムのようなもの

#### 1-7. Serverless Devsのロードマップ

- プラットフォームのサポート[^2]
    - Hosted
        - Azure
        - Google Cloud Platform
    - Installable
        - Knative
        - OpenWhisk
        - Kubeless
        - Laf
- ファンクションサポート[^2]
    - Serverless Devs K8s Controller
    - VScode Plugin
    - Serverless Devs Logs
    - Serverless Devs Cloud
    - Global Action
- その他サポート[^2]
    - より多くのサーバーレスサービスをサポート
    - より多くのBaaS製品への対応
    - IACの方向性の模索
    - Terraformとの連携


## ■ Let’s Get Started

### 1. Function Computeの実行（Serverless Devs）

Serverless Devsを利用してFunction Computeを作成および実行を行ってみます。

今回はdocsの[Quick start](https://docs.serverless-devs.com/en/serverless-devs/quick_start)を参考に[前回](https://qiita.com/junk87/items/45de5da6bb6f6d6b57fb)と同様、PHPによる「Hello World」の表示までを行います。
[前回](https://qiita.com/junk87/items/45de5da6bb6f6d6b57fb)の続きとなる為、「AliyunFcDefaultRoleロール」は作成済みの前提となります。

#### 1.1. AlibabaCloudにサインイン

自分のアカウント（メールアドレス）とパスワードを入力の上、【サインイン】をクリックします。

![FunctionCompute_10001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/646bbf8a-6b64-02d8-ead7-3d55f6f5e859.png)

ログイン後に表示される「アカウントID」はServerlessDevsの初期設定の確認で利用しますので控えておいてください。

![FunctionCompute_10001-id.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/49d79a62-bbce-afc1-eef6-1752b615fa4b.png)

#### 1.2. RAM アクセス制御コンソール画面へ移動

今回のServerlessDevs実行ではAccessKeyが必要となりますが、プライマリアカウントのAccessKey発行は避けたほうがよい為、RAMユーザー(AWSでいうIAMユーザー)を作成の上、AccessKeyの発行を行います。

まずは画面上部の検索窓へ【Resource Access Management】を入力してRAM アクセス制御コンソール画面へ移動します。

![FunctionCompute_10002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/873ac6b8-41d8-41ce-4f5b-88b54d27fa06.png)

#### 1.3. RAMユーザー作成

RAMアクセス制御の「ユーザー」を選択後、【ユーザーの作成】をクリックします。

![FunctionCompute_10003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/87bc4a68-c686-7e60-384e-feef645497e8.png)

ユーザーの作成画面にて以下の項目を入力後、【OK】をクリックします。

![FunctionCompute_10004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/6fb62987-4808-3653-c4e1-0ceb6e14d343.png)

- ログイン名
    - serverlessdevstest
- 表示名
    - serverlessdevstest
- アクセスモード
    - Open API によるアクセス

ユーザー作成後に表示される「AccessKey ID」および「AccessKey Secret」は控えておきます。
作成後はユーザーログイン名横のチェックボックスにチェックの上、【権限の追加】をクリックします。

![FunctionCompute_10005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/ad5a2913-6221-bdb1-98c5-03e589220e4c.png)

#### 1.4. RAMユーザーへの権限追加

権限の追加画面に「AdministratorAccess」を選択の上、【OK】をクリックします。
今回の検証では「AdministratorAccess」を選択していますが、実環境では必要最小限の権限のみ選択するようにしてください。

![FunctionCompute_10006.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e496a4aa-4f7e-935c-2477-e877380913f2.png)

権限を付与確認後、【完了】をクリックします。

![FunctionCompute_10007.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/b60fb96d-24d6-ce41-9cbf-351693466cb4.png)

#### 1.5. CloudShellの起動

今回は検証の為、CloudShellよりServerlessDevsを実行します。
RAMユーザーへの権限追加完了後、画面上のメニューより【CloudShell】をクリックします。

![FunctionCompute_10008.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e978ac8e-20be-b8dd-5ae4-a51fb23dfa3f.png)

画面下にCloudShellのターミナルが表示されていることを確認します。

![FunctionCompute_10009.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/d0372798-de03-e572-45b1-b3e5403256f2.png)

#### 1.6. Serverless Devs developer toolsの導入

CloudShellのターミナル上より以下のコマンドを実行してServerless Devs developer toolsを導入します。
CloudShell以外で導入する場合はNode.js12以降を導入後に実行してください。

```
npm install @serverless-devs/s -g
```

![FunctionCompute_10009_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/0cc086be-f127-230c-2710-09e9c9752030.png)


#### 1.7. Serverless Devsの初期設定

Serverless Devs developer toolsを導入後、以下のコマンドを実行します。

```
s config add
```

![FunctionCompute_10010.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/2b67ca82-ba74-29be-148e-191f0e8b0771.png)

Please select a providerにて「Alibaba Cloud(alibaba)」を選択

![FunctionCompute_10011.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/c4b2ed75-9f68-aa3d-7ff5-e40eed8f3926.png)

AccessKeyIDおよびAccessKeySecretはRAMユーザー作成時に控えた値を入力、Key pairは何も入力せず「default」のままエンターを押します。

入力内容確認後、Configuration successful が表示されることを確認します。
AccountIDは「対象のアカウントID」であるかどうか確認してください。

![FunctionCompute_10012.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/3cefd086-3c80-3cd2-f6c9-4de1429169f3.png)

#### 1.8. Serverless Devsのプロジェクト作成およびデプロイ

CloudShellのターミナル上より以下のコマンドを実行します。

```
s
```

No Serverless-Devs project is currently detected. do yu want to create a new project?にて「Y」を入力して新しいプロジェクトを作成します。

![FunctionCompute_10013.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/aa2284d7-90db-698f-26bc-4827b035fc0b.png)

プロジェクトの設定画面では以下の項目を入力または選択します。
最後に Do you want to deploy the project immediately? の項目に「Y」を入力することでプロジェクトのデプロイが開始されます。

![FunctionCompute_10013.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/1ae0b566-9223-9a8c-bcb0-1000df0f9c5d.png)

- Hello Serverless for Cloud Vendors : Alibaba Cloud Serverless
    - Alibaba Cloudを選択
- Hell, serverlesser. which template do you like? : Quick start [Deploy a Hello World function to FaaS]
    - QuickStartのHello Worldを選択
- Wich template do you like? : [HTTP] PHP7
    - PHP7を選択
- Please input your project name (init dir) : start-fc-http-php7
    - デフォルトのプロジェクト名を入力
- please input region : ap-northeast-1
    - 東京リージョン(ap-northeast-1)を入力
- please input serviceName : FirstServiceServerlessDevs
    - Function Computeのサービス名を入力（今回は「FirstServiceServerlessDevs」と入力）
- please input : FirstFunctionServerlessDevs
    - Function Computeの関数名を入力（今回は「FirstFunctionServerlessDevs」と入力）
- please select credential alias : default
    - デフォルトのエイリアスを選択

デプロイ完了後にデプロイ結果が表示されますので確認します。
デプロイ結果（今回の場合は「helloworld」以下）は動作確認にて必要となる為、控えておきます。

![FunctionCompute_10014.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e0125c70-8dc2-a1d4-8f97-ea25781c698b.png)

デプロイ結果を控えていない場合は後ほど以下のコマンドを実行することで確認可能です。

```
cd [プロジェクト名]
s info
```

![FunctionCompute_10014_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/4a539574-6063-8033-30fe-d8b2ce85ca28.png)

その他のServerless DevsコマンドについてはDocの[User guide of commands](https://docs.serverless-devs.com/en/serverless-devs/command/readme)をご確認ください。

#### 1.9. Serverless Devsプロジェクト作成後の動作確認

デプロイ結果に出力されているURLに対して、ブラウザ(Chromeなど)やコマンド(curlなど)で動作を確認します。

- system_url : https://firstfulessdevs-firstselessdevs-********.ap-northeast-1.fcapp.run
    - 「Hello World」が出力されたJSONファイルを取得
- custom_domain : http://firstfunctionserverlessdevs.firstserviceserverlessdevs.**********.ap-northeast-1.fc.devsapp.net
    - 「Hello World」が表示

#### 1.10. Serverless Devsプロジェクトで作成したFunction Computeの確認

ServerlessDevsのプロジェクトで作成したFunction Computeをコンソール画面から確認してみます。

**Function Compute(サービス)**

![FunctionCompute_10015.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/231a65b1-d3fd-98b8-7af3-738fde7863fb.png)

**Function Compute(関数)**

![FunctionCompute_10016.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/d9755c65-0ab3-9dd2-cb49-a6eb1e1fb260.png)

**Function Compute(HTTPトリガー)**

![FunctionCompute_10017.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/54fa94a2-1fd2-ec23-3e96-cab957c18f29.png)

**Function Compute(ドメイン名)**

![FunctionCompute_10018.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/a5bb79b4-7802-14a2-0fcc-22d0f5174d20.png)

## ■ Next Time

次回はFunction Computeを利用したWebフレームワークをServerless Devsで実装してみたいと思います。

[^1]:https://github.com/Serverless-Devs/Serverless-Devs/blob/master/LICENSE
[^2]:https://github.com/Serverless-Devs/Serverless-Devs/blob/master/ROADMAP.md