re:Invent2020で発表されたAWS Protonとはなにか?

はじめに

ご無沙汰しております。 最近は多忙でブログ書けていませんでしたが、今回は事例紹介やプラクティスのご紹介ではなく、re:Invent2020のAndy Jassy's Keynoteで発表されたAWS Protonというサービスについて、サービス概要や使い方、メリットなどをご紹介できればと思います。 最初サービス内容を聞いたとき、僕自身も「???」な状態だったので、同じように疑問をお持ちの読者の皆様へ理解の助けになればと思います。

注意事項

本ブログは2020-12-02時点の情報になります。 また記載時点ではAWS Protonはパブリックプレビュー状態であり、GA時に内容が変わる可能性がある点だけご留意いただければと思います。

AWS Protonとは?

誤解を恐れずに言ってしまえば、コンテナやサーバーレスアプリケーションからなるサービス構成を「統一的に管理・運用」するためのサービスです。

Protonを活用することで、インフラ(VPCなど)自体の構築やコードのデプロイ、監視やアプリの更新など、アプリ管理主体のチーム毎にそれぞれのオペレーションで実施するのではなく、統一的なインタフェースを利用して実施できる点が特徴です。

なお、Proton自体は管理サービス的な位置づけなので、料金は無料です。

AWS Proton Pricing | Fully Managed Application Deployment Service | Amazon Web Services

現在はプレビュー版ですが、特にプレビュー利用の申し込みなしに、下記リージョンは利用可能です。

※ECS/Fargate, ECRなど他のAWSサービスと協調して利用する(単体で利用しない)サービスなので、Amazon Protonではなく、AWS Protonとネーミングされているようですね。

Protonを構成する要素と流れ

Protonはテンプレートと呼ばれる雛形を定義しておき、それらを再利用しながら環境を構築していく流れになります。 テンプレートは2種類あり、環境テンプレートサービステンプレートから構成されます。

環境テンプレートはVPC等インフラ部分を定義するものです。 一方、サービステンプレートはLambdaやECSタスク定義、ALB、CloudWatch AlarmやCI/CDを構成するCodePipeline / CodeBuildなどが定義されます。 実態としては、以下のファイル等から構成されるYAMLファイル(CloudFormation定義含む)になります。

テンプレートは、AWS提供のサンプルを利用するか、自前で作るかのいずれかを選択し(自前の場合はS3バケットに配置してパスを指定)、AWSサンプルを選択した場合は、FargateコンテナベースLambdaサーバーレスベースを指定する形になります。

なお、AWSが提供するProtonのテンプレートサンプルは以下に公開されていますので、どのようなリソースを把握するには良いかと思います。

github.com

GitHubリポジトリを覗くと、環境テンプレートやサービステンプレートで構成されるAWSリソースが確認できます。例えば、Fargate用環境テンプレートではVPC, Subnet, インターネットゲートウェイ、ルートテーブル、セキュリティグループやECSクラスター等が定義されています。またFargate用サービステンプレートでは、ECSタスク定義、ALBやオートスケール設定、CloudWatchアラームなどが定義されています。

テンプレートを登録した後、そのテンプレートを指定・再利用しながら環境やサービスを構築していきます。 大きく、以下ステップでProtonを活用する流れになります。

  • 環境テンプレートの作成
  • サービステンプレートの作成
  • 作成した環境テンプレートをもとに環境を作成
  • 作成したサービステンプレートをもとにサービスを作成
  • アプリケーション開発&CI/CD、各テンプレートの更新

実際にイメージしやすいよう、AWSリソースと関連させた内容は以下になります。

f:id:iselegant:20201202232316p:plain

なお、管理者向けドキュメントにもProtonの流れが記載されています。 こちらを併せて参照すると理解が深まるかと思います。

docs.aws.amazon.com

実際のProton構築の流れ

ここからは、実際にAWSコンソール上でProtonを構築してみます(構築に興味ない読者の方は読み飛ばしてください・・・)。

現在、AWS ProtonはすでにAWSサービス検索から見つけることができます。

Protonのサービスページに遷移すると、以下のような画面に遷移できます。

f:id:iselegant:20201202165358p:plain

セットアップ通り、まずは環境テンプレートを作成していきます。

Protonテンプレートの作成

環境テンプレート作成画面では、自前テンプレート or AWSサンプルテンプレートの利用を選択します。 AWSサンプルテンプレートを選択すると、fargateベース or lambdaベースを選択します。

f:id:iselegant:20201202165443p:plain

テンプレート名を入力して環境テンプレートを作成します。 KMSを指定してCMKで暗号化も可能ですが、今回はスキップしています。

f:id:iselegant:20201202165555p:plain

環境テンプレートを作成し、少し待つと一覧上に表示されます。 因みに、作成したバージョンを明示的に公開しない限り、実際にプロビジョニングすることはできないようです(承認プロセスを挟むことができそうです)。

f:id:iselegant:20201202165616p:plain

続けて、サービステンプレートを作成します。 環境テンプレート同様、バンドルタイプとサンプルテンプレートを選択します。

f:id:iselegant:20201202165714p:plain

サービステンプレート名とサービスを紐付ける環境テンプレートを指定して作成します。

f:id:iselegant:20201202165743p:plain

サービステンプレート作成後は以下のような一覧が表示されます。 環境テンプレート同様、作成したバージョンを明示的に公開しない限り、実際にプロビジョニングすることはできません。 環境テンプレート同様の開発者体験が可能なUIとなっており、そこまで迷わなさそうですね。

f:id:iselegant:20201202173008p:plain

以上でテンプレートの作成は完了です。

Protonのセットアップ

続いて、ProtonがCI/CDを実行するために必要なIAMロールを作成します。 新規ロールの作成 or 既存ロールの利用 を選択します。 今回は新規作成なので、スキーマ名を入力し、同意事項にチェックを入れてロールを作成します。

f:id:iselegant:20201202165847p:plain

これでProtonのセットアップは完了です。

環境の作成とデプロイ

さて、ここまでで準備が整ったので、環境テンプレートから環境を作成していきましょう。 3ステップで作成していきます。

ステップ1: 環境テンプレートを選択

先程作成した環境テンプレートを指定して、次へと進みます。

f:id:iselegant:20201202165905p:plain

ステップ2: 環境を設定

環境名と先程作成した環境ロールを指定して、次へと進みます。

f:id:iselegant:20201202172512p:plain

ステップ3: 環境カスタム設定の構成

テンプレートから選択可能なオプション項目を入力します。 AWSが提供するFargateテンプレートでは、VPCとサブネットの入力が可能なので、適切な値を入力して作成しましょう。

f:id:iselegant:20201202170316p:plain

以下のような状態になったら環境の作成は完了です。

f:id:iselegant:20201202172718p:plain

最後にサービステンプレートからサービスを作成していきます。

サービスの作成とデプロイ

環境テンプレート同様、3ステップで作成します。

ステップ1: サービステンプレートを選択

先程作成したサービステンプレートを指定して、次へと進みます。 ちなみに、サービステンプレートの公開がされてないと、該当のバージョンを選択することはできません。

f:id:iselegant:20201202170353p:plain

ステップ2: サービスを設定

サービス名とデプロイするアプリケーションのリポジトリ情報を指定して、次へと進みます。 現状では、BitBucket/GitHub/GitHub Enterpriseが選択可能なようです。

Create a connection - Developer Tools console

f:id:iselegant:20201202170411p:plain

ステップ3: サービスのカスタム設定の構成

環境設定と同様、テンプレートから選択可能なオプション項目を入力します。 AWSが提供するFargateテンプレートでは、公開するポートやタスク数、タスクのコンピューテーションリソースなどの指定が可能です。 適切な値を入力して作成しましょう。

f:id:iselegant:20201202170956p:plain

以下のような結果になると、無事デプロイまで完了です。

f:id:iselegant:20201202173118p:plain

Protonを利用するメリット

上記で作成したProtonですが、結局のところ利用者にとって何が嬉しいのでしょうか? 公式ドキュメントにも記載されていますが、主に以下の3つです。

開発者に対するガードレールの適用

開発者側にある程度のテンプレートの開発自由度を委ねつつ、承認された各種テンプレートのみ内容を利用させることでテンプレート適用を制御が可能です。 実際にテンプレートを作成すると、公開するかどうかを選択できるので、ここでワンクッション挟むことでガードレールの思想を提供できます。

生産性向上のための統一的なインターフェース

環境やサービス構築や運用管理の主軸をProtonによせることで、デプロイやバージョニングなどが同じインターフェースで管理できます。 例えば、LambdaやECSサービスで別々のチームが担当し、SAMやCopilot、Terraformで個別デプロイしていたものが、Protonを利用することで同一操作でデプロイ操作を実現できます。

※現状はCloudFormationベースでの構築のみ利用可能

ベストプラクティスの実践

上記の記載と似ていますが、AWSが提供するテンプレートを活用しつつ組織としてのポリシーを反映させ、ベストプラクティスとして定義し、そのベストプラクティスに従うことで一貫したアーキテクチャを維持することができます。 Protonが間に挟まることで、その維持を手助けしてくれるイメージです。

これらのメリットを可視化すると以下のようになります。

f:id:iselegant:20201202171103p:plain

その他雑多な所感

環境やサービスの構築に関して、現状ではCloudFormationテンプレートのみが対応している状況です。 おそらく、読者の皆様の中にはTerraformやその他IaCツールを利用しているケースも多く、すでにそれらのツールでプロビジョニングの流れが確立されているケースも多いのかな、と思います。

Protonでは以下のように開発ロードマップが公開されており、その中でTerraformやGitHub Actionsとの連携も予定されています。

github.com

また現在はプレビュー版ですが、上記ロードマップ内featureの中にはNew RelicやDataDogとの連携が追加されており、モニタリングやオブザーバビリティの観点からも機能拡充していくものと考えられます。

コンテナやサーバーレスアプリケーションのワークロードが主流になりつつある中で、デプロイオペレーション方法の分散管理にペインをお持ちの方は、一度利用を検討してみると良いかも知れません。

※もちろん、プロダクション利用はGA後になりますが・・・

さいごに

最後までお読みいただきありがとうございました。 今回はre:Invent2020で発表された新サービスであるAWS Protonに関する概要をご紹介しました。 先2週間はしばらくre:Invent漬けなので、余裕があれば、また目新しいサービスをピックアップしてご紹介できればと思います。

本稿の内容に誤り等があれば、遠慮なくご指摘ください。

では!

参考情報

Preview: AWS Proton – Automated Management for Container and Serverless Deployments | AWS News Blog

AWS Proton | Fully Managed Application Deployment Service | Amazon Web Services

https://docs.aws.amazon.com/ja_jp/proton/index.html

AWS Proton: A first look | Containers