簡素なサーバレス構成をAWS Application Composer(preview)でどこまで作成できるか

# はじめに
Amazon SNSからSlackやTeamsに通知する際は、Lambda越しに送信する必要があります。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/sns-lambda-webhooks-chime-slack-teams/

構成としてはSNS->Lambda(->Slack,Teams)と単純ですが、先日発表されたAWS Application Composerで、どの程度まてテンプレートファイルを自動作成してくれるのか、試してみました。

# 参考

https://dev.classmethod.jp/articles/getting-started-application-composer/


# やったこと
Create projectでプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d25c3b4a-a0b5-1dd6-dbaf-aacd542b897e.png)

Select folderで、自PCのフォルダを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8114cdd7-6e7e-2343-1242-a0f7181d0278.png)
選択したフォルダに、自動作成されるファイルが保存されていきます。全角文字列が混じっていても大丈夫そうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/676c6d2b-0fbd-b086-5f8f-8aac5060e899.png)

ブラウザに許可のポップアップが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7061be6a-93ff-0350-d864-841cc8d418e5.png)

右下のCreateで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/cf530170-5584-41e9-87d4-5b09e0130338.png)

もう一度ポップアップが出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/6a88dc8a-7392-e650-f920-110c3e182822.png)

Canvasがいじれるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/575a376f-9efc-315c-a441-52e1471b6812.png)

:::note
一度閉じたりリロードした際でも、保存してあれば同じものが開けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d7dc64df-a293-4b71-c401-af21c5703488.png)
:::


SNSを配置します。詳細で論理IDが変更できますので修正してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/46f7e416-7ed1-143d-ebba-a48002899dc4.png)

Lambdaも配置します。設定項目はたくさんあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/53f6be36-62dc-932e-2698-ef58691e8af9.png)

Package typeは2種類あります。今回はZipで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/16144e58-7570-c460-5722-1f31681ab3a4.png)

Source pathも変えてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7c75d5a3-74cc-5e54-7715-ab754945dd68.png)

RuntimeはPython3.9を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/6237f67b-6042-8da1-59a1-beb01d9a00d2.png)

Architectureはx86で。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/bec94a39-2e12-c4f7-ebc6-a2a045e54eb0.png)

Handlerもいつも使う名前にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/621b7d8d-9d3d-96bc-9bda-217160c86ccb.png)

Memoryは最小にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a0a64906-84fb-f1d3-93d0-317118abcfcb.png)

Permissionsは自由入力ができるだけで、アタッチさせるIAMロールのArnを直接指定するようです。
また環境変数も設定してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7c0f0295-dc77-c3b3-f4e0-e99a0ff33375.png)

2つのパーツをつなげてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f78ce400-dbad-4b68-b788-59b411ae8a47.png)

保存すると、テンプレートが生成されていました。環境変数やSNSからのイベントもちゃんと作成されています。
Lambda用のロググループなんかも作成してくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/344b8627-ee7e-123f-bd2e-e8fda1f5bf23.png)

ファイルは以下の様に自動生成されていました。
```
D:.
│  template.yaml
│
└─functions
    └─notifyteams
            handler.py
            requirements.txt
```
先ほど画面で見たテンプレートは、`template.yaml`に出力されています。
Pythonファイルの中身は簡素でした。ここから先を自分で作ることになるようです。
```python:functions\notifyteams\handler.py
import json
def handler(event, context):
    # Log the event argument for debugging and for use in local development.
    print(json.dumps(event))

    return {}
```

# 注意点
使っていて気づいた点です。現時点でプレビュー版なので、一般利用時には変更されているかもしれません。

## IAMロールがない
Lambda関数にアタッチさせるIAMロールは、テンプレートの中にはありませんでした。SNSと接続していることを検知して、「対象のSNSを操作するインラインポリシーが定義されたロール」まで作ってくれることを期待していましたが、IAMロールを作成してはもらえませんでした。
別途作成してPermissionsで指定するか、作成されたテンプレートを直接編集する必要があります。

### <font color=red>2022.12.08追記</font>
IAMロールは、今回の構成では明示的に作る必要がないため、生成されないだけでした。
他の構成(Event BridgeやStep Functions)を使った際は、IAMロールも生成されていました。

## 保存時点の構成で作成される
ちょくちょく保存すると、その状態でファイル群が作成され、変更しても作成されたものは残ったままになります。
以下は、デフォルトがsrcフォルダを指定しており、そのまま保存したため、(指定しなくなった)srcフォルダが残った状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ac756b12-06ed-3391-27bb-45ffc4cc4b29.png)

## Handlerが反映されない
Handlerの部分ですが、画面上では`app.handler`に変更し、Template.yamlには反映されます。
しかし、自動生成されるファイルは`handler.py`と、デフォルトの設定値でのファイルになっていました。


# おわりに
GUIで、凡そのSAMテンプレートを作成してくれるのはだいぶ助かります。「SAMテンプレートが書けなくても作れるようになる」までのものではないですが、それでも十分便利と感じました。

早く一般利用可能になってほしい、大変期待できる新サービスでした。