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:*
期待した動作を説明します。
- Lambdaが1個作られる。名前は「demo-app-01-dev-XXXXX」
- S3バケットが1つ作られる。名前は「xxxxxxxxx-20200411」
- 「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をよく理解してなかったから、でした。ハハハ……
はい👻ではお疲れさまでした!