[祝GA] AWS Proton でコンテナアプリケーションの実行環境・CI/CD環境をサクッと作ってみた

一見「コンピューティング」カテゴリに所属するサービスかと思わせておいて、実は「管理とガバナンス」カテゴリのサービスなんです。(アイコンの色を見てね)
2021.06.17

みなさん、こんにちは!
AWS事業本部の青柳@福岡オフィスです。

昨年の re:Invent 2020 で、コンテナアプリケーションやサーバーレスアプリケーションのインフラ環境構築とデプロイをフルマネージドで管理できるサービス「AWS Proton」が発表されました。

発表と同時にパブリックプレビューが利用できるようになっていましたが、先日GA (一般供用開始) となりましたので、試してみました。

AWS announces the general availability of AWS Proton
Announcing the general availability of AWS Proton | Containers

(ところで、「Proton」とは英語で「陽子」(電子とか中性子とかと一緒に物理で習ったアレ) という意味だそうなんですが、このサービスにProtonと命名した意図するところは一体何なんでしょうね)

構築する環境の構成

Protonでは、コンテナアプリケーション/サーバーレスアプリケーションを実行するプラットフォームを「環境」「サービス」の2つのレイヤーに分けて管理します。

また、「環境」「サービス」それぞれについて、プラットフォーム管理者が「テンプレート」を用意しておき、システムや環境 (ここで言う「環境」は、開発・テスト・本番などの意味) に応じてテンプレートから実体 (AWSリソース) をデプロイすることができます。

今回は、Protonにデフォルトで用意されているサンプルのテンプレートを使用して、サクッと試してみることにします。

サンプルのテンプレートは、コンテナアプリケーション (Fargate) およびサーバーレスアプリケーション (Lambda) が用意されていますが、今回はFargateを使いました。

サンプルテンプレートを使って構築するシステムの構成は下図のようになります。(細かなリソースは省略しています)

「環境」と「サービス」で構築する範囲は以下のようになっています。

  • 「環境」
    • VPCおよびVPCの構成リソース (サブネット、インターネットゲートウェイ、etc.)
    • ECSクラスター
    • ECSタスク実行IAMロール
  • 「サービス」
    • 上記以外の全てのリソース

「サービス」に分類される範囲がかなり広いですね。

ただし、この区分は恐らく厳密に決まっている訳ではなく、テンプレートの設計思想によるのだろうと想定しています。

試してみた

今回の作業の流れは以下の通りです。

  • 事前準備
    • IAMユーザーの用意
    • IAMロールの用意
    • ソースコードリポジトリへの接続設定
  • テンプレートの登録
    • 「環境」テンプレート
    • 「サービス」テンプレート
  • 「環境」のプロビジョニング
  • ソースコードリポジトリの用意
  • 「サービス」のプロビジョニング
  • 構築されたサービスにアクセスしてみる
  • CI/CDを試してみる

事前準備: IAMユーザーの用意

Protonでは、ユーザーの役割として大きく「(プラットフォーム) 管理者」「(アプリケーション) 開発者」に分担されていることを前提としています。

役割を分担するということは、それぞれのユーザーに対して適切な権限を与える必要があります。例えば以下のような権限の付与が考えられます。

  • プラットフォーム管理者
    • テンプレートの作成・登録・更新
    • テンプレートの利用 (「環境」と「サービス」のデプロイ)
  • アプリケーション開発者
    • テンプレートの利用 (「サービス」のデプロイ)
    • アプリケーションの作成・更新 (これをトリガーにProtonがCI/CDパイプラインを実行する)
    • アプリケーションのテスト

今回は「お試し」ということで、全ての作業を「AdministratorAccess」権限のあるユーザーで実行しています。

(機会があれば、適切な権限の付与についても調べたいですね)

事前準備: IAMロールの用意

Protonでは、Protonサービスが利用するIAMロール (サービスロール) として、以下の2種類を用意する必要があります。

  • AWS Protonサービスロール
  • AWS Protonパイプラインサービスロール

いずれも、ユーザーに代わってProtonサービスがリソース作成などを行えるようにするためのIAMロールです。

これらのIAMロールを作成する方法として、それぞれ以下の通り複数の方法が用意されています。

  • AWS Protonサービスロール
    • 方法1: マネジメントコンソールで「環境」を作成する際にAWS推奨のIAMロールを自動的に作成する
    • 方法2: 予め作成しておいたIAMロールを「環境」を作成する時に選択する
  • AWS Protonパイプラインサービスロール
    • 方法1: マネジメントコンソールの「設定」-「アカウントロール」画面でAWS推奨のIAMロールを自動的に作成する
    • 方法2: 予め作成しておいたIAMロールを「設定」-「アカウントロール」画面で指定する

今回は、簡単に進めるために両方とも「方式1」を使うことにします。

と言うことで、「AWS Protonサービスロール」の作成については「環境」を作成する時に説明します。

ここでは「AWS Protonパイプラインサービスロール」を作成します。

Proton「アカウントロール」の設定

マネジメントコンソールから「Proton」→「設定」→「アカウントロール」を選択します。

現時点では、この画面から設定できるアカウントロールは「パイプラインサービスロール」のみです。

「設定」をクリックします。

「新しいサービスロール」を選択して、ロール名を入力します。

「アカウントに管理特権を持つProtonロールを作成することに同意します。(以下略)」にチェックを入れて、「変更を保存」をクリックします。

これで「パイプラインサービスロール」のIAMロールが作成されて、Protonに登録されました。

事前準備: ソースコードリポジトリへの接続設定

Protonでアプリケーションをデプロイする際、CI/CDパイプラインのトリガーとなるソースコードリポジトリとして以下の種類が選択できます。

  • Bitbucket
  • GitHub (GitHub Enterpriseを含む)
  • GitHub Enterprise Server

今回は「GitHub」を使うことにします。

事前準備として、ProtonがGitHubのリポジトリへ接続できるように設定します。

「Proton」→「設定」→「ソース接続」を選択します。

Codeシリーズの設定画面に遷移しますので、「接続を作成」をクリックします。

プロバイダー「GitHub」を選択、「接続名」を入力して、「GitHubに接続する」をクリックします。

GitHubの画面に遷移します。 AWSとの接続を許可するか求められますので「Authorize AWS Connector for GitHub」をクリックします。

Codeシリーズの画面に戻りますので、「新しいアプリをインストールする」をクリックします。

再びGitHubの画面に遷移します。 AWSと接続するGitHubアカウントを選択します。

AWSと接続するための「GitHubアプリケーション (GitHub Apps)」をインストールします。 対象範囲を「All repositories (全てのリポジトリ)」か「Only select repositories (指定したリポジトリのみ)」のいずれかを選択します。 今回は「All repositories」を選択しました。

Codeシリーズの画面に戻ります。 「GitHubアプリ」欄にGitHub AppsのIDが自動的にセットされていますので、「接続」をクリックします。

「接続」が作成されました。

「環境」テンプレートの登録

冒頭で説明しました通り、今回はサンプルのテンプレートを使います。

まず、「環境」のテンプレートを登録します。

マネジメントコンソールから「Proton」→「テンプレート」→「環境テンプレート」を選択します。

「環境テンプレートを作成」をクリックします。

テンプレートオプションは「新しい環境をプロビジョニングするためのテンプレートを作成」を選択します。

サンプルのテンプレートとして「Fargate」向け環境と「Lambda」向け環境が用意されています。 今回は「fargate-environment」を選択します。

「テンプレート名」は必須ですが、表示名と説明は省略可能です。

その他の項目は全てデフォルトのままにして、「環境テンプレートを作成」をクリックします。

テンプレートの登録が開始されます。 ステータスが「Registration in progress」となりますので、少し待ちます。

登録が完了すると、ステータスが「Draft」になります。 「Draft (下書き)」状態は、管理者が操作したりすることはできますが、まだアプリケーション開発者が利用できない状態です。

「Draft」状態のバージョンを選択状態にして「公開」をクリックします。

ステータスが「Published」になりました。これでテンプレートが利用可能な状態になりました。

「サービス」テンプレートの登録

続いて、「サービス」のテンプレートを登録します。

マネジメントコンソールから「Proton」→「テンプレート」→「サービステンプレート」を選択します。

「サービステンプレートを作成」をクリックします。

サンプルのテンプレートとして「Fargate」向けサービスと「Lambda」向けサービスが用意されています。 今回は「fargate-service」を選択します。

「テンプレート名」は必須ですが、表示名と説明は省略可能です。

「互換性のある環境テンプレート」を選択します。 ここでは「Fargate」向けサービスのテンプレートを登録しようとしているところですので、環境テンプレートも「Fargate」向けのものが選択できます。

選択状態になっていることを確認します。

その他の項目は全てデフォルトのままにして、「環境テンプレートを作成」をクリックします。

テンプレートの登録が開始されます。 ステータスが「Registration in progress」となりますので、少し待ちます。

登録が完了すると、ステータスが「Draft」になります。 環境テンプレートの時と同様に、「Draft」状態のバージョンを選択状態にして「公開」をクリックします。

ステータスが「Published」になりました。これで「環境」「サービス」それぞれのテンプレートの登録が終わりました。

「環境」のプロビジョニング

登録したテンプレートを使って「環境」のプロビジョニングを行います。

マネジメントコンソールから「Proton」→「環境」を選択します。

「環境を作成する」をクリックします。

登録した「環境」テンプレートが表示されていますので、選択して「設定」をクリックします。

展開先のアカウントとして「このAWSアカウント」を選択します。 (Protonは複数のアカウントを跨いで「環境」や「サービス」のプロビジョニングを行う機能もありますが、今回は単一アカウント内に作成します)

環境名と説明 (オプション) を入力します。

「事前準備: IAMロールの用意」で説明しましたように、「環境」に紐付く「AWS Protonサービスロール」をこのタイミングで作成できます。

「新しいサービスロール」を選択して、ロール名を入力します。

「アカウントに管理特権を持つProtonロールを作成することに同意します。(以下略)」にチェックを入れます。

その他の項目は全てデフォルトのままにして、「次へ」をクリックします。

テンプレートに設定された「カスタム設定 (≒パラメーター)」を入力します。

このテンプレートでは、VPCとサブネットのCIDRが指定できるようです。 省略することも可能ですので (デフォルト値が設定される)、今回は何も入力せずに先に進みます。

確認画面になりますので、「作成」をクリックします。

「環境」の作成が開始されます。 ステータスが「In progress」から「Succeeded」に変わるまでしばらく待ちます。

裏では、CloudFormationによってAWSリソースの作成が行われます。 今回使用したテンプレートでは、これらのリソースが作成されました。

ソースコードリポジトリの用意

続いて、「サービス」のプロビジョニングを行う前に、サービスで動作させるアプリケーションのソースコードを用意しましょう。

AWSよりサンプルコードが用意されていますので、こちらをコピーして使います。

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

サンプルリポジトリの内容は、READMEやライセンス関連を除くと、以下のファイルで構成されるシンプルなものです。

  • Dockerfile (nginxベースのコンテナイメージ定義)
  • index.html (nginxのドキュメントルートディレクトリに配置するHTMLファイル)

サンプルリポジトリを自分のGitHubリポジトリにForkします。 これでとりあえずソースコードリポジトリの用意は完了です。

「サービス」のプロビジョニング

ソースコードリポジトリの用意ができましたので、「サービス」のプロビジョニングを行います。

マネジメントコンソールから「Proton」→「サービス」を選択します。

「サービスを作成」をクリックします。

登録した「サービス」テンプレートが表示されていますので、選択して「設定」をクリックします。

サービス名と説明 (オプション) を入力します。

用意しておいたソースコードリポジトリの情報を指定します。

  • ブランチ名
  • リポジトリID
  • リポジトリ接続 → 「事前準備: ソースコードリポジトリへの接続設定」で設定した「接続」が選択できます

その他の項目は全てデフォルトのままにして、「次へ」をクリックします。

「環境」の時と同様に、テンプレートに設定された「カスタム設定 (≒パラメーター)」を入力します。

必須となっている「Name」と「Environment」のみ指定して、オプションの項目は省略します。

確認画面になりますので、「作成」をクリックします。

「サービス」の作成が開始されます。 「サービスのステータス」が「Create in progress」から「Active」に、「パイプラインのステータス」が「In progress」から「Succeeded」に、それぞれ変わるまでしばらく待ちます。

「サービス」では2つのCloudFormationスタックが実行されます。 こちらは「パイプライン」を除いた「サービス」本体のリソース群です。

こちらは「パイプライン」のリソース群です。

構築されたサービスにアクセスしてみる

これで「環境」および「サービス」のAWSリソース一式がプロビジョニングされましたので、構築されたサービスに実際にアクセスしてみます。

「サービス」のCloudFormationスタックの「出力」タブに、アクセス先のURLが表示されています。 (ALBのエンドポイントDNS名)

こちらのURLにWebブラウザでアクセスしてみます。

無事、アクセスすることができました。

CI/CDを試してみる

最後に、CI/CDパイプラインの動作を確認してみます。

ソースコードリポジトリの「index.html」の内容を書き替えます。

9行目の「background-color」の値を「rgb(35, 47, 62)」から「rgb(255, 153, 0)」にします。

<body style="background-color:rgb(35, 47, 62);">

書き換え後 ↓

<body style="background-color:rgb(255, 153, 0);">

11行目の「width」と「height」の値をそれぞれ2倍 (「140px」→「280px」、「175px」→「350px」) にします。

<svg width="140px" height="175px" viewBox="0 0 140 175" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

書き換え後 ↓

<svg width="280px" height="350px" viewBox="0 0 140 175" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

変更を保存して、コミット・リポジトリへのプッシュを行います。

しばらくすると、CodePipelineのパイプラインが実行を開始します。

パイプラインが最後まで実行完了するまで待ってから、Webブラウザをリロードします。

背景色が変わり、アイコンの大きさが縦横2倍になりました!

おわりに

AWS Protonを使うことで、Fargateコンテナアプリケーションのインフラ環境やCI/CDパイプラインがマネジメントコンソールの一貫した操作で構築できることを確認しました。

特に、アプリケーション開発者が行うことが想定される「テンプレートから『環境』や『サービス』をプロビジョニングする」「CI/CDパイプラインを使ってアプリケーションを更新・デプロイする」といった操作が、インフラの詳細な知識が無くても簡単に操作できそうなところがポイントだと思いました。

今回はサンプルとして用意されているテンプレートを使いましたが、Protonの真骨頂は「プラットフォーム管理者」がテンプレートを作成してアプリケーション開発者に利用してもらうところだと思います。

機会があれば、次回は「テンプレートの作成」に調整してみたいと思います。