AWS Protonを試して何に使えるか考える

# 何が起こるか把握する

まずは触ってみて、何が起こるか見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/9c0c7438-41b7-49b1-e134-9dd074de1cd3.png)

https://ap-northeast-1.console.aws.amazon.com/proton/home?region=ap-northeast-1#/

## 使用を開始する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/0dca57c4-b04f-78e0-662a-87867cba3c9c.png)

ガイドに従って以下を作成していきます。

1. 環境テンプレート
1. サービステンプレート
1. 環境
1. サービス
1. サービスインスタンス

- ※今回はFargateのサンプルバンドルを選択する
- ※名前が必要なものは連番で `sampleN` と付けていくことにする

## 結果を確認

### エンドポイント

ALBのパブリックエンドポイントが生成されてアクセスできるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/6a26592b-4f13-2dbe-3427-d6c92e8d68c8.png)

### Proton

| リソース | 結果 |
| -- | -- |
| 環境テンプレート | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/f3a2148d-9dda-5dc6-b096-253db6357a9e.png) |
| サービステンプレート | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/398b8208-e4a5-c513-bb83-365edaf29929.png) |
| 環境 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/41bcd940-a6e5-c2a4-7267-652cb580993c.png) |
| サービス | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/8e88dcc1-9383-4bc3-b430-2301bf19c3a4.png) |
| サービスインスタンス | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/9115d28f-6c30-832b-c68b-eb78c4cfadfa.png) |

### CloudFormation

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/36e2044a-e7f0-9215-9f0b-f0a54e2eaa6f.png)

| Proton | 結果 |
| -- | -- |
| 環境 | ![template1-designer (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/cf896d7d-a96c-a699-03b6-7bb7a8bb5ab4.png) |
| サービス<br>(サービスインスタンス) | ![template1-designer (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/0b29a129-540d-4cf0-d213-fd48e353cd4f.png) |
| サービス<br>(CI/CD piepline) | ![template1-designer (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/35216aef-37d0-7021-d563-6fc6ec041c9c.png) |

## ソースも確認する

今回使ったサンプルはこちらから確認できます。

https://github.com/aws-samples/aws-proton-sample-templates

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/66b1c21d-5320-c444-eca6-77e1f545e12f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/7a465f06-7e1e-bcb2-4246-380201348318.png)

## 分かったこと

- 環境を作成すると、`VPC一式`と空の`ECSクラスター`が作られる
  - ※DBやRedisなどが必要な場合はここで作ることになりそうか
- サービスを作成すると、作成ウィザードの中でサービスインスタンス用の設定も聞かれ、サービスインスタンスも作られる
  - ※Fargateの場合、サービスインスタンスで `ECS Service` `ECS TaskDefinition` `ALB` `ALB TargetGroup` などアプリケーション一式を作るイメージか
- サービスインスタンスの作成が終わればALBのエンドポイントが出力される
  - そのURLにアクセスするとNginxの画面が見える
- [サービスのスキーマにpipeline_infrastructureがある場合](https://github.com/aws-samples/aws-proton-sample-templates/tree/main/loadbalanced-fargate-svc/service)は `CodePipeline` 周りも作成される模様
  - `ECR`が作られる
  - `Codepipeline`が作られる
    - Sourceステージ
      - ウィザードで選択したアプリケーションのGitリポジトリはここに紐づけられている
    - Buildステージ
      - `CodeBuild`
      - アプリケーションのDockerfileをビルドしてECRにプッシュする
    - Deployステージ
      - `CodeBuild`
      - Protonのサービスインスタンスのパラメーターを上書き（サンプルでは`image`）して新バージョンに更新する
      - 新バージョンの更新が終わるまで待つ(aws cliの`--wait`オプション）

# 何に使えるか考える

さて、ここからが面白い作業ですね。
何に使えるか考えていきましょう。

※この先は今後随時追加していくと思います。

## ブランチプレビュー環境

ウィザードでリポジトリとブランチをポチポチ選んでFargateのデプロイができてしまうのであれば、まず思いつくのはやはりこれではないかと思います。
手作業で作って消してもよいですし、GithubActionsで自動化しても面白そうですね。

### フロントのコーディングだけ確認したい版

- 課金少なめになるよう工夫できれば嬉しい
  - DBはタスク定義の別コンテナで建てるかSQLiteにでもする
  - 永続ストレージも不要なのでコンテナの一時ストレージを使う

## ステージ環境

- 本番に似た環境で課金少なめの構成も作れそう

## パッケージアプリケーションのカスタマイズ版

### OEM開発

自社である程度まで開発したアプリケーションをカスタマイズして別サービスとしてリリースするようなことってよくありますよね。
ベースが同じアプリケーションであればインフラのベースも（最初は）同じでよいので、予め作っておいたProtonで簡単に量産体制が作れるかもしれないですね。

### 買い切り

販売したパッケージのカスタマイズまで請け負わないケースもありますよね。
そういう場合も、初期デプロイと継続デプロイのセッティングまで行う納品を**エンジニア不要**で出来てしまうかもしれませんね。

## よく使うちょっとしたAPI

本記事ではFargate版バンドルを試しましたが、Lambda版バンドルも試したところ簡単にAPI GatewayでCRUD APIが生成されたので、Fargate以外でも使い道がありそうです。

### 郵便番号検索API

郵便局のデータを使って郵便番号検索APIってよく作りますよね。
こんなのはもうパッケージにしておいて案件ごとにProton起動させて瞬殺にしてしまいたいですね。
CI/CD付きなので最新データへの更新も心配ないですね。

### 静的サイトのメールフォーム系

昨今、静的サイトを瞬殺デプロイできるサービスは様々ありますが、やはりメールフォームや申込フォームをどうするか悩みますよね。
そういうのも、Lambdaでさっと作ってあるものをProtonでデプロイできれば楽になりそうですね。
LambdaであればAWSコンソール上で編集までできるので、「ちょっと返信メールの文言変えたい」くらいの事がやはり**エンジニア不要**でできますね。

## AWSアカウントを跨いだ納品

今回は試していないですが、別アカウントにデプロイする機能もあるようなので、
納品先のAWSの子アカウントの権限だけもらって、Proton自体は自社アカウントで作動させて納品完了ということもできるのかもですね。
※CodePipelineはどっちにできるんだろうか・・ 要調査

# おわり

ある程度ベースを作っておけば、量産系の作業が楽になったり、エンジニアの作業範囲から外せてしまうものもありそうでとても良さそうですね。