Lambda関数をアプリ化して、Serverless Application Repositoryで公開しよう [15分で完成編]

# 🔶 はじめに
業務の中で、Lambdaでちょっとした便利な関数を作っても、自分だけが使ってるだけでは勿体無いです。
しかし、他の人にもLambda関数を使ってもらおうと思うと、環境変数や権限設定が煩雑で、「気軽にどうぞ」とはなかなか行きません。

ところが、AWSの[Serverless Application Repository](https://aws.amazon.com/jp/serverless/serverlessrepo/)を使う事で、Lambda関数を、ボタンクリックでインストールできるアプリとして、公開する事が可能です。

# 🔶 利用サービス
### 🔷 Serverless Application Repository
https://aws.amazon.com/jp/serverless/serverlessrepo/
公式サイトの説明は以下の通りです。
> AWS Serverless Application Repository は、サーバーレスアプリケーション用のマネージド型リポジトリです。チーム、組織、開発者個人が、再利用可能なアプリケーションを保存して共有できます。また、強力な新しい方法でサーバーレスアーキテクチャを簡単に組み立ててデプロイすることもできます。

一言で言うと、サーバレスアプリケーションを作成して登録すると、みんながボタンクリックで、登録したアプリをすぐに使えるようにしてくれるサービスです。
**アプリを一般公開する事も可能ですが、今回は自分のAWSアカウント内の公開とします。**

### 🔷 Lambda
https://aws.amazon.com/jp/lambda/
様々な言語のコードをデプロイできる実行環境。
ここで作った関数を、サーバレスアプリケーションにします。

### 🔷 Amazon S3
https://aws.amazon.com/jp/s3/
ストレージサービス。
サーバレスアプリケーションのソースコード置き場として使うので、実際には何でも良いのですが、今回はS3を使います。

# 🔶 作業手順

1. サーバレスアプリケーションの作成
  1. Lambda関数から、ソースコードとSAMファイルを取得
  1. S3にソースコードを格納
  1. SAMファイルの修正
1. Serverless Application Repositoryに、サーバレスアプリケーションを登録

# 🔶 サーバレスアプリケーションの作成
まずは、Lambda関数をサーバレスアプリケーション化します。
何でも良いですが、今回は用意されているサンプルの関数を使用します。

サンプルの関数を用意する方法が分からなければ、以下を参照してください。
参考：[API Gateway + LambdaでREST API開発を体験しよう [10分で完成編]]
(https://qiita.com/tamura_CD/items/46ba8a2f3bfd5484843f)

### 🔷 Lambda関数から、ソースコードとSAMファイルを取得

**1. Lambda関数を選択して、画面上部の [アクション] → [関数のエクスポート] をクリックする。**
<img width="1177" alt="001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/9a1a68e2-551e-757f-da2b-b54fceca6f07.png">

**2. 以下のダイアログが表示されるので、[AWS SAMファイルのダウンロード] [デプロイパッケージのダウンロード]の両方をクリックする。**
<img width="826" alt="002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/3c1473cd-47a5-04a3-f81c-650edbda684a.png">

⬛ SAMファイル

- AWSにはサーバーレスアプリケーションを構築するために使用するフレームワークがあるのですが、そこで構築するために必要な定義情報が書かれたファイル。
- 開いてみたらわかりますが、今回はLambda関数のプロジェクト情報が書かれています。

⬛ デプロイパッケージ

- 関数のソースコード一式を、ZIPで圧縮したもの。
- 開いてみたら分かりますが、今回はJSファイルが圧縮されているだけです。

### 🔷 S3にソースコードを格納

**1. S3のバケットを作成して、 ポリシーを設定する。**

[アクセス権限] → [バケットポリシー] を開く。
<img width="1177" alt="003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/e387527b-3432-6c73-df91-3a29bcba7e2c.png">
以下のようにポリシーを記述します。

```json:バケットポリシー
 {
    "Version": "2012-10-17",
    "Id": "■■■■■■■■■■■■■■■■■",
    "Statement": [
        {
            "Sid": "chouhuku-sinakya-nandemo-yoi",
            "Effect": "Allow",
            "Principal": {
                "Service": "serverlessrepo.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::sample-hello-bucket/*"
        }
    ]
}
```
ポリシーの内容を簡単に解説すると、

* このバケットは、Serverless Application Repositoryで公開するアプリの、ソースコードの格納先になるので、バケットの利用を認める対象はServerless Application Repositoryになります。よって、`"Service": "serverlessrepo.amazonaws.com"`を設定します。
* このバケットに格納したソースコードを利用したいので、バケットの中を取得する`"Action": "s3:GetObject"`権限を設定します。
* 上記の設定の対象範囲としては、本バケット配下としたいので、`"Resource": "arn:aws:s3:::sample-hello-bucket/*"`を設定します。

**2. S3のバケットに、ソースコードをアップロードする。**

S3のバケットに、先程ダウンロードしたデプロイパッケージをアップロードします。
アップロードしたら、以下の[コピーパス]をクリックして、ファイルのパスを取得します。
<img width="1178" alt="004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/1c1f2dd7-6fc7-d95f-1e22-4794602d63b2.png">


### 🔷 SAMファイルの修正

**1. 先程ダウンロードしたSAMファイルを開いて、設定情報を記載する。**

SAMファイルを開いて、以下の`CodeUri`に先程コピーしたファイルパスを貼り付けます。

```yaml:sample_Hello.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
  sampleHello:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: s3://sample-hello-bucket/sample_Hello-cba9fc2c-bd5b-407c-81fa-cc8d832858ad.zip
      Description: ''
      MemorySize: 128
      Timeout: 3
      Role: 'arn:aws:iam::■■■■■■:role/service-role/sample_Hello-role-k6eww01p'

```
## 🔶 サーバレスアプリケーションの登録

**1. Serverless Application Repositoryで、公開したいアプリの情報を登録する。**
[マイアプリケーション] → [アプリケーションの公開] をクリックする。
<img width="1177" alt="005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/e86f2bd0-b517-03f2-da42-2e750a786ec7.png">

以下の画面に遷移するので、公開したいアプリの情報を入力します。
<img width="1176" alt="006.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/7942d661-f129-f89c-c6b7-2bb6f05d21c2.png">
一点注意したいのが、**登録の際に指定したリージョンでしか、アプリケーションを利用する事はできない**という点です。（今回で言えば、アプリの利用はオハイオ限定になります）
変更したい場合は、ここで変更します。

⬛アプリケーション名
任意の名称をセットします。

⬛筆者
任意の名称をセットします。

⬛Home page
Github等の、アプリについてのサイトがあればセットします。

⬛アプリケーションの説明
利用者が分かりやすいうように、アプリケーションについての説明をセットします。

⬛アプリケーション名
任意の名称をセットします。

⬛Labels
任意のラベル名をセットする。
管理の事を考えると、何かしらの単語をセットする事を推奨します。

⬛SPDXライセンス
本アプリをどのうように公開するか、ライセンスを設定します。

続き
<img width="1177" alt="007.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/7812123b-931c-1667-1e4d-e07050d3b555.png">

⬛ライセンス
SPDXライセンスを選択すると、自動的にセットされます。
任意のファイルをアップロードしたり、直接ライセンスを記述する事もできます。

⬛Readme
前述までを入力すると、雛形の内容が自動的にセットされます。
任意のファイルをアップロードしたり、直接ライセンスを記述する事もできます。

⬛セマンティックバージョン
アプリのバージョンを、セマンティックバージョンの書式（1.0.0のような書き方）でセットします。

⬛ソースコードURL
ソースコードをGithub等で公開している場合、URLをセットします。

続き
<img width="1177" alt="008.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/05013d1c-7c8d-277d-9f4f-f3bbe4cfda26.png">

⬛SAMテンプレート
先程修正した、SAMファイルをアップロードします。

上記を一通り入力したら、［アプリケーションの公開］をクリックします。

以下の画面に遷移すると、Lambda関数がサーバレスアプリケーションとして公開されます。
<img width="1178" alt="009.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/6ad27e96-a583-118d-cb95-224d31b83963.png">

## 🔶 動作確認
**1. Serverless Application Repositoryで、公開したアプリをデプロイする。**

[Available applications] → [Private applications] を開いて、先程登録した［helloApps］をクリックします。
<img width="1175" alt="010.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/f3d3d23d-2719-0f7d-36b8-aebfbe9b6ee1.png">

Lambda画面に遷移するので、最下部にある［デプロイ］をクリックします。
<img width="1177" alt="011.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/f7315226-43f4-173c-f5ee-96e3258b20f9.png">

しばらく待つとデプロイが終わり、以下の画面に遷移します。
<img width="1178" alt="012.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/c904d538-2ba5-5082-b8c5-c8485b9669fe.png">

左のメニューの［アプリケーション］をクリックすると、アプリケーションがデプロイされている事が確認できます。
<img width="1179" alt="013.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/e8a6ad15-ace1-e572-38fd-11ecc394d8c6.png">

**2. デプロイしたアプリを削除する。**
デプロイしたアプリケーション、［serverlessrepo-helloApps］をクリックします。
<img width="1179" alt="014.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/e93aca64-eb8c-f1cf-1e69-a5454b5c071f.png">

［CloudFormationスタック］をクリックします。
<img width="1180" alt="015.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/35e8ce7b-9000-329d-eb23-792fa3627e53.png">

CloudFormationの画面に遷移するので、右上の ［その他のアクション］ → ［スタックの削除］ をクリックする。
<img width="1176" alt="016.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/34ab14e9-5129-2bff-9fd3-9eeac21f0714.png">

確認ダイアログが表示されるので、［はい、削除する］をクリックします。
<img width="564" alt="017.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/43dbb941-e960-8b99-9a52-66c5cdabdf86.png">

これで、しばらく待つとアプリは完全に削除されます。

## 🔶 まとめ
以上の手順で、Lambda関数をサーバレスアプリケーションとして、AWSアカウント内に公開する事ができます。

難しいポイントは、SAMファイルの設定で、今回はアプリとして利用しているサービスがLambdaのみだったのでシンプルでしたが、API GatewayやRDS等、他のサービスが絡む程、記載内容が膨らみます。

ただ、今回のようなちょっとしたアプリであれば、SAMファイルの最低限の修正で、簡単に公開する事ができます。
ぜひ、作ったLambda関数をみんなに公開してみてください。

## 🔶 応用編

今回はアカウント内でのアプリ公開でしたが、他のAWSアカウントに公開する事もできます。
興味があれば挑戦してみてください。

- [Serverless Application Repositoryで他のAWSアカウントにもアプリを公開しよう](https://qiita.com/tamura_CD/items/cf8354703f173870d61c)

## 🔶 参考

- [新サービス AWS Serverless Application Repository をさらっとウォークスルー](https://toris.io/2017/12/walk-through-serverless-application-repository/)
- [AWS Serverless Application Repository - アプリケーションの公開](https://docs.aws.amazon.com/ja_jp/serverlessrepo/latest/devguide/serverless-app-publishing-applications.html)