AWS Application Composer in VSCodeを使ってAPIを作ってみた

# はじめに
こんにちは、都内でソフトウェアエンジニアとして活動している[YSasago](https://qiita.com/YSasago)です。
AWS re:Invent 2023の基調講演でDr. Werner Vogelsによって発表されたAWS Application Composer in VSCodeを使って、実際にAPIを作成してみたいと思います！基調講演は[Youtube](https://youtu.be/UTRBVPvzt9w?si=5nRqa3j17gIICjYP)で視聴することができます
![スクリーンショット 2023-12-28 14.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/2d34787a-f744-d253-4604-61178d4a7028.png)

# Application Composerとは
Application Composerは、前年のre:Inventで初めて発表されたツールで、AWSコンソール内で直感的にサーバーレスアプリケーションを構築できるドラッグアンドドロップ式の便利なツールです。このツールはAWSのベストプラクティスに準拠し、Infrastructure as Code (IaC) の自動生成を可能にします。

![スクリーンショット 2023-12-28 14.31.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/5642ee0f-f812-340b-fcf9-b5a114cbf675.png)

https://aws.amazon.com/jp/application-composer/


# VSCodeでApplication Composerを使ってみる
今年のre:Inventでは、[VScode](https://code.visualstudio.com/)からApplication Composerを使用することができるようになったと発表があったので実際に試してみました。

## 完成品
以下の構成図に示すように、```/hoge```というエンドポイントを持つAPIを作成します。

![スクリーンショット 2023-12-28 14.39.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/55ac083b-504c-32b8-c71b-1acd187cca8c.png)

```shell
$ curl  https://xxxxxxxxxxx.amazonaws.com/Prod/hoge/                                                                         
{"message": "hello hoge world"}%       
```

## 事前準備

### AWS SAM CLIのインストール
AWS SAM CLIを使用するために、以下のドキュメントを参照しながらインストールを行います。


https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html


samコマンドが使えるようになれば準備完了です。
```shell
$ sam --version
SAM CLI, version 1.105.0
```

### aws configureの設定
aws configureを用いて認証情報を設定します。

```shell
$ aws configure
AWS Access Key ID [None]: {アクセスキー}
AWS Secret Access Key [None]: {シークレットアクセスキー}
Default region name [None]: ap-northeast-1
Default output format [None]: json
```


## VSCodeに拡張機能をインストール
[AWS Toolkit for Visual Studio Code](https://aws.amazon.com/jp/visualstudiocode/?trk=ad553193-613c-4a84-acde-bf4fa6c173a5&sc_channel=el)をVSCodeにインストールします。

![FireShot Capture 065 - Visual Studio コードプラグイン — AWS Toolkit for Visual Studio Code - AWS_ - aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/20f0a0dc-9c5c-2556-8cd6-401293b0eba0.png)

[VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode)から直接インストールできます。

![FireShot Capture 066 - AWS Toolkit - Amazon Q, CodeWhisperer, and more - Visual Studio Marke_ - marketplace.visualstudio.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/1db7e8ef-d92a-7c00-72af-f284084efcc1.png)


インストール完了後のスクリーンショット
![スクリーンショット 2023-12-28 14.58.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/fa33cde5-9894-03a8-0945-0581d1a84c96.png)


## samコマンドを使って初期プロジェクトの作成
`sam init`を実行してプロジェクトを作成します。

```shell
sam init

You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.

Which template source would you like to use?
	1 - AWS Quick Start Templates
	2 - Custom Template Location
Choice: 1

Choose an AWS Quick Start application template
	1 - Hello World Example
	2 - Data processing
	3 - Hello World Example with Powertools for AWS Lambda
	4 - Multi-step workflow
	5 - Scheduled task
	6 - Standalone function
	7 - Serverless API
	8 - Infrastructure event management
	9 - Lambda Response Streaming
	10 - Serverless Connector Hello World Example
	11 - Multi-step workflow with Connectors
	12 - GraphQLApi Hello World Example
	13 - Full Stack
	14 - Lambda EFS example
	15 - Hello World Example With Powertools for AWS Lambda
	16 - DynamoDB Example
	17 - Machine Learning
Template: 1

Use the most popular runtime and package type? (Python and zip) [y/N]: y

Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: n

Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: n

Would you like to set Structured Logging in JSON format on your Lambda functions?  [y/N]: y
Structured Logging in JSON format might incur an additional cost. View https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-pricing for more details

Project name [sam-app]: demo-app

    -----------------------
    Generating application:
    -----------------------
    Name: demo-app
    Runtime: python3.9
    Architectures: x86_64
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    Configuration file: demo-app/samconfig.toml

    Next steps can be found in the README file at demo-app/README.md


Commands you can use next
=========================
[*] Create pipeline: cd demo-app && sam pipeline init --bootstrap
[*] Validate SAM template: cd demo-app && sam validate
[*] Test Function in the Cloud: cd demo-app && sam sync --stack-name {stack-name} --watch
```

## VSCodeでApplication Composerを開く
作成したプロジェクトをVS Codeで開き、template.yamlを右クリックして「Open with Application Composer」を選択します。

![スクリーンショット 2023-12-28 15.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/9be83a6f-b86a-3d2d-fd7d-e6b83de9fd0b.png)

sam initによって自動生成されるHelloWorldFunctionが表示されます。

![スクリーンショット 2023-12-28 15.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/99916070-7587-3b4c-add9-e2e938408aa7.png)


# APIの作成
hogeAPIを作成します。まず、自動生成されたAPI GatewayにGETメソッドで`/hoge`のパスを追加し、保存します。


![スクリーンショット 2023-12-28 15.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/7005bb80-6d62-c61b-79a6-ef556964784e.png)

次に検索バーでLambdaと入力してLambda関数をドラッグアンドドロップします。そのあと先ほど作成した/hogeから線で結びます。


![スクリーンショット 2023-12-28 15.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/0682d89b-3a7a-3975-d054-686533e59a96.png)

新しく追加したLambda関数の詳細を開き、論理IDとソースパスの箇所に適当な名前を入力します。今回は、HogeFunctionとしました。

![スクリーンショット 2023-12-28 15.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/42061ce5-45a3-e031-06fe-704d325e488b.png)


フォルダを確認すると、自動でHogeFunctionが作成されているのが確認できます。

![スクリーンショット 2023-12-28 15.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/fa0354c5-2c09-2287-af27-c7fd1513bf6b.png)

HogeFunctionの、handler.pyを開き、コードの中身を下記のように変更します。

```python:handler.py
import json


def handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps(
            {
                "message": "hello hoge world",
            }
        ),
    }
```

## 実行してみよう
準備が整ったので、実際にビルドとデプロイを行い、APIをテストします。

```shell
$ sam build
....
....
Build Succeeded

$ sam deploy
...
...

Successfully created/updated stack - demo-app
```cessfully created/updated stack - demo-app
```

APIが作成できました。sam initから約15分でAPIを作成することができました！


実際に叩いてみましょう。
デプロイした結果のOutputsにAPIのURLがあるので、パスを/hogeにして叩いてみましょう。

```
$ curl https://xxxxxx.amazonaws.com/Prod/hoge                                                                           
{"message": "hello hoge world"}
```

hello hoge worldとかえってきら確認終了です。

確認ができたら今回作成したリソースを削除しておきましょう。

```
$ sam delete
```

# おわりに
今回はVSCodeでApplication Composerを使ったAPIの作成を試みました。【良い点】と【気になる点】をまとめます。

### 良い点
- 視覚的にわかりやすく、権限設定なども自動で行われる
- AWSコンソールを開かずにApplication Composerを使用できる
- 別途構成図を作成する必要がない

### 気になる点
- アイコンのドラッグアンドドロップでコードが自動生成されるため、間違って操作した場合には手動でコードを削除する必要がある