/ #AWS #ServerlessFramework 

ServerlessFrameworkでデプロイに成功したのに、リソースやトリガーが足りない🌀

もくじ

今回躓く所

はい👻

ServerlessFrameworkでS3のオブジェクト新規作成時に呼び出すトリガーをつけたLamdaをデプロイしたのに、 Lamdaだけデプロイされて、S3バケットもトリガーもない。という躓きです。

ついでにServerlessFrameworkのデプロイ時にエラーはでません。

では躓きます。

つまずきソースコードは下記に保存しました

https://github.com/sisi100/sls-error-demo/tree/master/demo_01

関係あるコードだけ説明します。

Lambdaのコード。Pythonです。

def yyyyyy(event, context):
    return {"statusCode": 200}

はい。結構狂ったコードです。ごめんなさい。 で、ServerlessFrameworkのコードがこちら

service: demo-app-01

provider:
  name: aws
  runtime: python3.7
  region: ap-northeast-1

functions:
  XXXXX:
    handler: XXXXX.yyyyyy
    events:
      - s3:
        bucket: xxxxxxxxx-20200411
        event: s3:ObjectCreated:*

期待した動作を説明します。

  1. Lambdaが1個作られる。名前は「demo-app-01-dev-XXXXX」
  2. S3バケットが1つ作られる。名前は「xxxxxxxxx-20200411」
  3. 「demo-app-01-dev-XXXXX」のトリガーに “「xxxxxxxxx-20200411」にオブジェクトが新規追加された場合” が設定される。

で、このyamlが中途ハンバに間違っているせいで $ sls deployを叩くとエラーなく正常に完了するのに 3. のトリガーが追加されません

デプロイ直後の実際の画像がこちら( ↓ )

原因

原因は下記のファイルです。

service: demo-app-01

provider:
  name: aws
  runtime: python3.7
  region: ap-northeast-1

functions:
  XXXXX:
    handler: XXXXX.yyyyyy
    events:
      - s3:
        bucket: xxxxxxxxx-20200411  # この行のインデント
        event: s3:ObjectCreated:*   # この行のインデント

yaml全体が長いので下記にフォーカスします。

    #省略……
    events:
      - s3:
        bucket: xxxxxxxxx-20200411  # この行のインデント
        event: s3:ObjectCreated:*   # この行のインデント

この場所ですがjsonで表すと、下記のようになることを期待してます。

{
  "event":{
    "S3":{
      "bucket": "xxxxxxxxx-20200411",
      "event": "s3:ObjectCreated:*"
    }
  }
}

が、実際にyamlをjsonへ変換するサービスで変更すると、 実は下記のような期待してないjsonになってしまいます。

{
  "events": [
    {
      "s3": null,
      "bucket": "xxxxxxxxx-20200411",
      "event": "s3:ObjectCreated:*"
    }
  ]
}

はい。期待どおりのjsonになってませんでした👻

期待どおりにするために、“bucket"と"event"のインデントをもう1つ下げることが必要でした。

正しいyaml

    events:
      - s3:
          bucket: xxxxxxxxx-20200411
          event: s3:ObjectCreated:*

↑ jsonへ変換 ↓

{
  "events": [
    {
      "s3": {
        "bucket": "xxxxxxxxx-20200411",
        "event": "s3:ObjectCreated:*"
      }
    }
  ]
}

はい、期待どおりのjsonになしました。

これ実際にインデントを下げてデプロイしたものが下記。

きちんとトリガーにS3が設定されました。

ハマった原因ですが……自分がYAMLをよく理解してなかったから、でした。ハハハ……

はい👻ではお疲れさまでした!

Author

Sisii

インフラが好きなエンジニアぶってるなにか