【AWS】Application Composerが強すぎるかもしれない

どうもこんにちは。

今回は、以下の記事で書いたAWS SAMの使い方に付随して、AWS Applidation Composerの使い方についてまとめます。

https://qiita.com/PDC-Kurashinak/private/2653ac715c148ac916df

↓アイコンはこれ（クラスメソッドさんの記事から拝借させていただきました。）↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/6df94a18-fbfa-b04f-59f6-a9252b6dc1c5.png)

https://dev.classmethod.jp/articles/application-composer-ga/

# Application Composerとは？

**AWS Application Composer** というツールを使用すると、AWS SAMで核となる`template.yml`をGUI上で作成することができるそうです。これは、VScodeの拡張機能`AWS Toolkit for visual studio code`をインストールすることで使用することができます。もちろん、AWSマネジメントコンソール上でも使用できます。

今回はせっかくなので、VScodeで使用してみます。

また、Application Composer自体は無料で使用することができます。

# 前提条件

AWS SAM CLIのインストール方法は[こちら](https://qiita.com/PDC-Kurashinak/private/2653ac715c148ac916df)で説明をしています。

また、`sam init`コマンドでサーバーレスアプリケーションのプロジェクトを作成している前提でお話を進めます。

# 使い方

## 1. template.ymlをApplication Composerで開く

`template.yml`を右クリックすると、下の方に「Open with Application Composer」というメニューが出てくるので、クリックします。

![スクリーンショット 2024-08-31 19.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/7399aa93-460d-2185-9086-7a0565ec2916.png)

## 2. Canvasが開く

そうすると、Application ComposerのCanvasが開きます。（画面かっちょいい）

![スクリーンショット 2024-08-31 19.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/41e1ce5f-bc78-7878-422a-95e8f35c781f.png)

## 3. ポチポチやってみよう！

雑な説明ですが、この手のツールの操作方法は触ってみるのが一番早いです。

### 3-1. API Gatewayにメソッド追加/削除

対象のAPI Gatewayをクリックして、「詳細」をクリックします。

![スクリーンショット 2024-08-31 20.02.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/ecfe92e8-f660-5405-d27c-f2fe0e2f28e1.png)

「ルートを追加」をクリックして、メソッドとパスを入力して「保存」をクリックします。

![スクリーンショット 2024-08-31 20.02.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/b0c51a7c-82af-82af-14da-ae726e7cff67.png)

保存するとルートが増えます。

![スクリーンショット 2024-08-31 20.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/e0024442-de41-6793-020a-c5f83656e9b6.png)

### 3-2. 追加したルートに新しいLambda関数を紐づける

左から「Lambda関数」という要素を右にドラッグして、API Gatewayのbyeメソッドと線で繋ぎます。

![スクリーンショット 2024-08-31 20.06.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/a170d943-98a0-bd83-76b2-0deb8b591b07.png)

![スクリーンショット 2024-08-31 20.14.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/78425e8b-34f2-5d04-02b8-2f73800705dc.png)

### 3-3. template.ymlを確認

template.ymlを確認してみると、`ByeByeFunc`が追加されていると思います。

```yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: |
  sam-test-01
  Sample SAM Template for sam-test-01

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 10
    MemorySize: 128

    # You can add LoggingConfig parameters such as the Logformat, Log Group, and SystemLogLevel or ApplicationLogLevel. Learn more here https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-loggingconfig.
    LoggingConfig:
      LogFormat: JSON
Resources:
  SamTestFunc:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.12
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get
  ByeByeFunc:
    Type: AWS::Serverless::Function
    Properties:
      Description: !Sub
        - Stack ${AWS::StackName} Function ${ResourceName}
        - ResourceName: ByeByeFunc
      CodeUri: src/Function
      Handler: handler.handler
      Runtime: python3.12
      MemorySize: 3008
      Timeout: 5
      Tracing: Active
      Events:
        ServerlessRestApiGETbye:
          Type: Api
          Properties:
            Path: /bye
            Method: GET
  ByeByeFuncLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    Properties:
      LogGroupName: !Sub /aws/lambda/${ByeByeFunc}

Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  HelloWorldApi:
    Description: API Gateway endpoint URL for Prod stage for Hello World function
    Value: !Sub https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/
  SamTestFunc:
    Description: Hello World Lambda Function ARN
    Value: !GetAtt SamTestFunc.Arn
  SamTestFuncIamRole:
    Description: Implicit IAM Role created for Hello World function
    Value: !GetAtt SamTestFuncRole.Arn
```

ちょっとすごすぎ...

Application Composerの方でLambdaの関数を`lambda_handler`に変えたら、`template.yml`の記述も変りました。ただ、プロジェクト内に作成されたファイルの名称までは変わらないようですね。

だとしても十分すぎる機能ではないでしょうか？

これ、会議の中でアーキテクチャ考えるのにも使えますよね!