AWS Protonについて

# AWS Protonとは
AWS Proton は、コンテナおよびサーバーレスアプリケーションのための初の完全マネージド型アプリケーションデプロイサービスです。

公式説明文より
> AWS Proton は、コンテナおよびサーバーレスアプリケーションのための初の完全マネージド型アプリケーションデプロイサービスです。AWS Proton を使用すれば、プラットフォームエンジニアリングチームは、インフラストラクチャのプロビジョニング、コードデプロイ、モニタリング、更新の際に必要になるさまざまなツールをすべて接続し、協調させることできます。

> 数百、場合によっては数千のマイクロサービスを、絶えず変化するインフラストラクチャリソースと継続的インテグレーション/継続的デリバリー (CI/CD) 構成で維持することは、どんなに有能なプラットフォームチームにとってもほぼ不可能なタスクです。

> AWS Proton を利用することで、この煩雑なタスクを管理して一貫した標準を適用するために必要となるツールをプラットフォームチームが手にすることとなり、デベロッパーはコンテナとサーバーレステクノロジーを利用してコードを簡単にデプロイできるようになるため、前述の問題を解決できます。

https://aws.amazon.com/jp/proton/

Protonには環境とサービスという概念があります。
誤解を恐れずにいうと環境はネットワークなどのインフラ部分をまとめた概念で、サービスはアプリケーションを実行する環境をまとめた概念です。

それぞれを定義したテンプレートを用い、アプリが稼働するための基盤を管理します。
テンプレートには「Environment templates」と「Service templates」があり、それぞれ以下に対応しているようです。

- Environment templates
    - ネットワークなどインフラ部分の定義
    - サンプルのテンプレートとして以下の2種が用意されている
        - fargate-environment
        - lambda-environment
- Service templates
    - アプリの実行環境やCI/CDパイプラインなどの定義
    - テンプレートに実行するソースコードがあるリポジトリを連携することで、サービスをデプロイする。

## 試してみる

こちらを参考に、試してみます。

https://docs.aws.amazon.com/proton/latest/adminguide/ag-getting-started-console.html

### 環境テンプレートの作成
まず環境テンプレートを作成します。
「環境テンプレート-環境テンプレートの作成」から作成します。
以下のように設定します。

- テンプレートオプション：新しい環境をプロビジョニングするためのテンプレートを作成
- テンプレートバンドルソース：サンプルテンプレートバンドルの1つを使用
- サンプルテンプレートバンドル：fargate-environment
- テンプレート名：my-env-template
- テンプレート表示名(オプション)：My Fargate Environment
- タグ：任意

![proton_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/9aa9546b-1b8c-a6dc-eff0-99fdd839ddfd.png)

作製が完了すると環境テンプレート詳細画面に遷移するので、「テンプレートのバージョン」項目の「1.0」のラジオボタンを選択し、「公開」ボタンを押します。
するとステータスがPublishとなります。

![proton_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/8aff32c7-5017-60f1-7871-77fa48210aab.png)

### サービステンプレートの作成
次にサービステンプレートを作成します。
左のハンバーガーメニューから、「サービステンプレート-サービステンプレートを作成」を選択します。

以下のように設定します。

- テンプレートバンドルソース：サンプルテンプレートバンドルの 1 つを使用
- サンプルテンプレートバンドル：fargate-service
- テンプレート名：my-svc-template
- テンプレート表示名：My Fargate Service
- 互換性のある環境テンプレート：My Fargate Environmentをチェック
- タグ：任意

作製が完了したら、先ほどと同様に公開を行います。
![proton_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/e7da1fd3-0113-6a8c-83ad-c43d4399c1d0.png)

### 環境の作成
次に、環境の作成を行います。
「環境-環境を作成する」から作成を行います。

Step1：環境テンプレートの選択
先ほど作成した「My Fargate Environment」を選択し、設定を押します。

Step2：環境を設定
以下のように設定します。

- 展開アカウント：このAWSアカウントを選択
- 環境名：my-fargate-environment
- 環境ロール：新しいサービスロール
- 環境ロール名：MyProtonServiceRole
- 環境ロールのチェックボックスをオン
- タグ：任意

Step3：カスタム設定を構成
全てデフォルトを使用する為、何も入力せず次へ行きます。

Step4：レビュー
良ければ作成を押します。

数分後、作成が完了します。
![proton_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/2e748688-8fd6-37b2-dcdb-d995f1582479.png)

内部的にCloudFormationが動いているので、Stackも作成されていることが確認できました。
![proton_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/cb55f441-1795-798c-4391-eba167b5f8af.png)


### サービスの作成
次にこちらを参考に、サンプルアプリを稼働させてみます。

https://docs.aws.amazon.com/ja_jp/proton/latest/userguide/ug-getting-started.html

まずリポジトリ接続を設定します。
 
GitHubリポジトリと接続を行います。
「設定-ソース接続-接続を作成する」から接続の設定を行います。

適当な接続名を付けます。(connect-testとしました。)
![proton_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/c27cfff3-f82e-d27d-6cad-1932d9cda0aa.png)

設定すると、Githubアカウントと連携するように言われるので、連携を行います。
その後、試したい自アカウントのリポジトリを選択し、接続を行います。
今回は公式のサンプルアプリを使用する為、以下のリポジトリをフォークし使用しました。

https://github.com/aws-samples/aws-proton-sample-fargate-service

リポジトリの選択が完了したら「接続」を押下します。接続が完了します。

![proton_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/9bd3712e-2d42-b1f5-2d7c-12344b73c0e5.png)

次にサービスを作成します。
「AWS Proton-サービス-サービスの作成」を押下し、作成します。

Step1：サービステンプレートの選択
先ほど作成した「My Fargate Service」を選択し、設定を押します。

Step2：サービスを設定
以下のように設定します。

- サービス名：my-service
- ブランチ名：各々(mainとしました。)
- リポジトリ名：各々(「githubアカウント名/aws-proton-sample-fargate-service」としました。)
- リポジトリ接続：connect-test
- タグ：任意

Step3：カスタム設定を構成
以下のように設定します。

- Name：my-app-service
- Environment：my-fargate-environment

その他デフォルト。

Step4：レビュー
良ければ作成を押します。

数分待つと作成が完了しました。
![proton_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/16358ff3-427a-98c1-deae-56b36e226906.png)

NLBのエンドポイントを叩いてみると、index.htmlが表示されデプロイできていることを確認できました。
![proton_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/236bb7cb-eaab-693f-5676-c05a00273eca.png)

### お片付け
Step1.サービス
「サービス-アクション-削除」でサービスを削除します。

Step2.環境
「環境-アクション-削除」で環境を削除します。

Step3.サービステンプレート
「サービステンプレート-アクション-削除」でサービステンプレートを削除します。

Step4.環境テンプレート
「環境テンプレート-アクション-削除」で環境テンプレートを削除します。

Step5.接続
「ソースの接続-接続-削除」で接続を削除します。

# まとめ
アプリのインフラと実行環境を統合的に管理できるのは楽でいいですね。特に意識することなくCI/CDパイプラインでデプロイまで自動化できるのも良いと思います。
次触る機会があればtemplateの準備からやってみたいです。