serverless framework (AWS) のプラグインについて

最近 AWS Lambda を開発・デプロイするにあたり、serverless framework を使っているのですが、多くのnpmプラグインがあります。

今回は今まで利用したプラグインを備忘録としてまとめておきます。

## serverless-domain-manager

API Gatewayのカスタムドメインを作ることができます

[amplify-education/serverless-domain-manager: Serverless plugin for managing custom domains with API Gateways.](https://github.com/amplify-education/serverless-domain-manager)

### 設定例

下記で、ACMによる証明書の発行、Route53へのレコード登録、カスタムドメイン設定の追加を行えます。

```yaml:serverless.yml
custom:
  defaultStage: dev
  customDomain:
    domainName: hogehoge.fugafuga.com
    basePath: ${self:provider.stage}
    stage: ${self:provider.stage}
    certificateName: '*.fugafuga.com'
    createRoute53Record: true
```

## serverless-offline

serverless framework の設定を使って、ローカルで Lambda と APIGateway をエミュレートするためのプラグインになります。

[dherault/serverless-offline: Emulate AWS λ and API Gateway locally when developing your Serverless project](https://github.com/dherault/serverless-offline)

### 設定例

plugins に以下を追加して実行するだけで起動します。

```yaml:servereless.yml 

plugins:
  - serverless-offline
```

```bash
serverless offline start
```

あとは APIGateewayのようにリクエストを投げればOKです

```bash
curl -H 'x-api-key:<offline実行時に発行されたキー>' <URL>
```

## serverless-offline-ssm-provider

serverless framework上で環境変数に SSM からの値を適応したい時、ローカル上でも再現する場合に使います。

`.env` ファイルをSSMのリソースと見立てて読み込むことができます。

[serverless-plugins/packages/serverless-offline-ssm-provider at master · CoorpAcademy/serverless-plugins](https://github.com/CoorpAcademy/serverless-plugins/tree/master/packages/serverless-offline-ssm-provider)

### 設定例

```yaml:serverless.yml

plugins:
  - serverless-offline-ssm-provider
  - serverless-offline

functions:
  ssm_sample:
    name: ${self:service}_${self:provider.stage}
    handler: lambda.handler
    role: <Lambdaに設定するロール>
    environment:
      SSM_PARAMETER_VALUE: ${ssm:sample_ssm_parameter}
```

```txt:.env
sample_ssm_parameter=plain_text
```



## serverless-s3-local

serverless-offline で ローカルで S3 をエミュレートするためのツールです。S3のEventにも対応してます。

[ar90n/serverless-s3-local](https://github.com/ar90n/serverless-s3-local) 

### 設定例

(リポジトリ内にも[サンプル](https://github.com/ar90n/serverless-s3-local/tree/master/example)があります)

```yaml:serverless.yml
service: local-s3

plugins:
  - serverless-offline
  - serverless-s3-local

provider:
  name: aws
  runtime: python3.7
  stage: ${opt:stage, self:custom.defaultStage}
  s3:
    port: 4569
    directory: /tmp # ホストマシンでファイルを配置したいディレクトリを指定します

custom:
  defaultStage: dev
functions:
  s3hook:
    name: ${self:service}_${self:provider.stage}
    handler: lambda.handler
    role: <Lambdaに設定するロール>
    events:
      - s3:
          bucket: local-bucket
          events:
            - s3:ObjectRemoved:*
          rules:
            - suffix: .txt
```

### ローカルS3の AWS-CLI によるアクセス方法


- `~/.aws/config`と `~/.aws/credential` を編集しておきます。(別 profileで分けておきます)

```ini:~/.aws/config
[s3local]
region=<Lambdaと同じregion>
```

```ini:~/.aws/credential
[s3local]
aws_access_key_id=S3RVER
aws_secret_access_key=S3RVER
```


- serverless offline を用いて、Lambdaを実行します

```bash
serverelss offline start
```

- ローカルS3のファイルを操作するには、エンドポイントを指定します([AWS CLI](https://aws.amazon.com/jp/cli/)が必要です)
    - S3はオブジェクトストレージなので、指定したホストマシン側のS3ファイル保存先パスにファイルコピーするだけだとダメです。ホストマシンはファイルシステムなので、保存形式が異なります。

```bash
# コピーの例です
aws --endpoint="localhost:4569" s3 cp ~/tmp/data.csv s3://local-bucket/userdata.csv --profile s3local
```

## serverless-existing-s3

S3が既にある場合にS3イベントを紐付けするためのプラグイン。

serverless framework v1.48~ はS3が既にある場合も紐付けが可能ですが、こちらの方法だと内部で IAMロール を作成しないため、一応紹介しておきます。

[matt-filion/serverless-external-s3-event: Deprecated: No longer needed as serverless.com natively supports external buckets now.](https://github.com/matt-filion/serverless-external-s3-event)


### 設定例

```yaml:serverless.yml
plugins:
  - serverless-plugin-existing-s3

provider:
  name: aws

custom:
  defaultStage: dev
functions:
  integrationS3:
    name: ${self:service}_${self:provider.stage}
    handler: lambda.handler
    role: <Lambdaに設定するロール>
    events:
      - existingS3:
          bucket: hogehoge-s3-bucket
          events:
            - s3:ObjectCreated:PUT
```

## 終わりに

今回紹介したのは、ローカルにAWSをエミュレートするようなプラグインばかりでした。。。

serverless framework はアップデートも周辺プラグインの更新も早いので、今後の動向に注意して使いたいですね。