⚛️

AWS Proton が GA したのでやっていきましょう Part.2 (ハンズオン編)

2021/06/20に公開

やっていく

事前準備

繰り返しになりますが、GA のタイミングでマルチアカウント環境がサポートされましたので、もし可能であれば 2 つの AWS アカウントを用意していただくことをオススメします。以降、2 つの AWS アカウントを下記のように呼ぶことにします。

  • 開発アカウント
  • 本番アカウント

この記事では、まずは開発アカウントのセットアップをしていきます。

インフラ担当者の作業

まずはインフラ担当者になりきって、開発アカウントで AWS Proton の設定をしましょう。

ユースケース図

1. 環境テンプレートの作成

本来であれば環境テンプレートはイチから作成したいところですが、ここは既に用意されているサンプルテンプレートを利用することにします。

  • ナビゲーションバーの左上から [サービス] - [管理とガバナンス] - [AWS Proton] をクリックします。
  • ナビゲーションペインから [環境テンプレート] をクリックします。
  • 環境テンプレート一覧画面の右上から [環境テンプレートを作成] ボタンをクリックします。
  • [環境テンプレートを作成] 画面で下記の値を入力します。
    • [テンプレートオプション]: 新しい環境をプロビジョニングするためのテンプレートを作成
    • [テンプレートバンドルソース]: サンプルテンプレートバンドルの 1 つを使用
    • [サンプルテンプレートバンドル]: fargate-environment
    • [テンプレートの詳細]
      • [テンプレート名]: my-environment-template
    • その他のパラメーター: (デフォルト値)
    • [環境テンプレートを作成] ボタンを選択します。

作成後に表示される画面には「次に、サービステンプレートを選択します」とメッセージが表示されますが、ここでは図に合わせて環境の作成から実施します。

2. 環境の作成

先ほど作成した環境テンプレート my-environment-template を元に、開発アカウント内に環境を作成します。

  • ナビゲーションペインから [環境] をクリックします。
  • 環境一覧画面の右上から [環境を作成する] ボタンをクリックします。
  • [環境テンプレートを選択] 画面で下記の値を選択し、[設定] ボタンをクリックします。
    • [環境テンプレート]: my-environment-template
  • [環境を設定] 画面で下記の値を選択し、[次へ] ボタンをクリックします。
    • [展開アカウント]: この AWS アカウント
    • [環境設定]
      • [環境名]: dev
    • [環境ロール]
      • [環境ロール]: 新しいサービスロール
      • [環境ロール名]: ProtonServiceRole
      • [アカウントに管理特権を持つ …(以下略)]: チェックを入れる
    • その他のパラメーター: (デフォルト値)
  • [カスタム設定を構成] 画面ではそのまま [次へ] ボタンをクリックします。
  • [レビュー] 画面で入力した値に問題がないことを確認し、[作成] ボタンをクリックします。

環境一覧画面で [デプロイのステータス] が Succeeded になればデプロイが完了です。それでは実際にデプロイされた環境を確認してみましょう。

  • ナビゲーションバーの左上から [サービス] - [管理とガバナンス] - [CloudFormation] をクリックします。
  • ナビゲーションペインから [スタック] をクリックします。
  • スタック一覧画面に下記のスタックが作成されているのが分かります。
    • AWSProton-<環境名>-cloudformation—<ランダム文字列>
  • スタック名をクリックします。
    • 画面上部のタブから [リソース] をクリックします。

このスタックで、VPC、サブネット、インターネットゲートウェイや ECS クラスターといった共有リソースが作成されていることが確認できます。

3. サービステンプレートの作成

サービステンプレートも、既に用意されているサンプルテンプレートを利用することにします。

  • ナビゲーションバーの左上から [サービス] - [管理とガバナンス] - [AWS Proton] をクリックします。
  • ナビゲーションペインから [サービステンプレート] をクリックします。
  • サービステンプレート一覧画面の右上から [サービステンプレートを作成] ボタンをクリックします。
  • [サービステンプレートを作成] 画面で下記の値を入力します。
    • [テンプレートバンドルソース]: サンプルテンプレートバンドルの 1 つを使用
    • [サンプルテンプレートバンドル]: fargate-service
    • [テンプレートの詳細]
      • [テンプレート名]: my-service-template
    • [互換性のある環境テンプレート]
      • my-environment-template を選択します
    • その他のパラメーター: (デフォルト値)
    • [サービステンプレートを作成] ボタンを選択します。

図に書かれていない作業として、2 つの作業があります。

1 つ目はアカウントロールの設定です。これは AWS Proton が CI/CD パイプラインをデプロイするときに利用されるサービスロールです。

  • ナビゲーションペインから [アカウントロール] をクリックします。
  • 画面の右上から [設定] ボタンをクリックします。
  • [CI/CD パイプラインロールを設定] 画面で下記の値を入力し、[変更を保存] ボタンをクリックします。
    • [パイプラインサービスロール]: 既存のサービスロール
    • [パイプラインサービスロール ARN]: ProtonServiceRole

2 つ目は AWS CodeStar Connection の設定です。AWS Proton は現時点では AWS CodeCommit をサポートしていませんので、この設定で GitHub、GHE、BitBucket との紐づけが必要になります。ここでは GitHub との紐づけを行います。

  • ナビゲーションバーの左上から [サービス] - [開発者用ツール] - [CodeCommit] をクリックします。

「え、CodeCommit?CodeStar じゃないの?」と思った貴方。するどい。この設定は CodeStar の設定なのに、なぜか CodeStar の画面に設定箇所はなく、Code シリーズの画面にあります。

理由は…謎です。

  • ナビゲーションペインから [設定] - [接続] をクリックします。
  • 画面の右上から [接続を作成] ボタンをクリックします。
  • [接続を作成する] 画面で下記の値を入力します。
    • [接続名]: proton-github
  • [GitHub に接続する] ボタンをクリックします。
  • [GitHub に接続する] 画面で [新しいアプリをインストールする] ボタンをクリックします。
  • GitHub の画面に飛んで、認証を求められてなんやかんやあります。
    • このあたりは下記を参照すると良いでしょう。

https://docs.github.com/ja/developers/apps/managing-github-apps/installing-github-apps

  • その後、[接続] ボタンをクリックします。

アプリ担当者の作業

ここからはアプリ担当になりきって、開発アカウントで ECS サービスのデプロイをしていきます。

ユースケース図

4. サービスの作成 / 6. サービスインスタンスの作成

はい、タイトルの通り、ここでサービスとサービスインスタンスをまとめて作成できます。

  • ナビゲーションペインから [サービス] をクリックします。
  • サービス一覧画面の右上から [サービスを作成] ボタンをクリックします。
  • [サービステンプレートを選択] 画面で下記の値を選択し、[設定] ボタンをクリックします。
    • [環境テンプレート]: my-service-template
  • [サービスを設定] 画面で下記の値を選択し、[次へ] ボタンをクリックします。
    • [サービス設定]
      • [サービス名]: my-service-dev
    • [サービスリポジトリの設定]
      • [ブランチ名]: master
        • git 2.28 以降を利用していて init.defaultBranch = main であれば main にするとよいでしょう [1]
      • [リポジトリ ID]: xeres/my-service
        • この時点で GitHub 側にリポジトリが存在していなくても問題ありません
      • [リポジトリ接続]: proton-github
    • その他のパラメーター: (デフォルト値)
  • [カスタム設定を構成] 画面で下記の値を選択し、[次へ] ボタンをクリックします。
    • [Name]: dev-instance
    • [Environment]: dev
  • [レビュー] 画面で入力した値に問題がないことを確認し、[作成] ボタンをクリックします。

座学編で、下記のように書いたのはここの手順なんですよね。サービスインスタンス毎にブランチと1:1になるのであれば分かるのですが…。

1 つのサービスに、開発環境と紐付けられたサービスインスタンス、本番と紐付けられたサービスインスタンス、といったように複数のサービスインスタンスを紐づけることができそうなのです。が、サービス作成時にしか出来ないらしく、あとで追加・削除が出来ないので使い勝手が悪そうです。また、サービスとブランチは1:1なので、その点でも使いどころがよく分かりません。

サービスインスタンス一覧画面で [デプロイのステータス] が Succeeded になればサービスインスタンスのデプロイが完了です。

おそらく先にサービスインスタンスがデプロイを完了するでしょう。から、まずは実際にデプロイされたサービスインスタンスを確認してみましょう。

  • ナビゲーションバーの左上から [サービス] - [管理とガバナンス] - [CloudFormation] をクリックします。
  • ナビゲーションペインから [スタック] をクリックします。
  • スタック一覧画面に下記のスタックが作成されているのが分かります。
    • AWSProton-<サービス名>-<サービスインスタンス名>-cloudformation—<ランダム文字列>
  • スタック名をクリックします。
    • 画面上部のタブから [リソース] をクリックします。

internet-facing な ALB の後ろに ECS サービスが登録されている状況が分かるのではないでしょうか。

再び、サービスインスタンスの画面に戻ります。

  • ナビゲーションバーの左上から [サービス] - [管理とガバナンス] - [AWS Proton] をクリックします。
  • ナビゲーションペインから [サービスインスタンス] をクリックします。
  • サービスインスタンス一覧画面から [dev-instance] をクリックします。
  • 画面中程の [出力] 欄に [ServieEndpoint] キーと値に URL が記載されています。

この URL をコピーして、ブラウザでアクセスしてみましょう。

Nginx のデフォルトトップページ

無機質な Nginx のデフォルトトップページが表示されるでしょう。

さて、そろそろサービスのデプロイが完了しているのではないでしょうか。サービス一覧画面で [ステータス] が Active になればサービスのデプロイが完了しています。

  • ナビゲーションバーの左上から [サービス] - [管理とガバナンス] - [CloudFormation] をクリックします。
  • ナビゲーションペインから [スタック] をクリックします。
  • スタック一覧画面に下記のスタックが作成されているのが分かります。
    • AWSProton-<サービス名>-cloudformation—<ランダム文字列>
  • スタック名をクリックします。
    • 画面上部のタブから [リソース] をクリックします。

CodePipeline と ECR リポジトリが作成されているのが分かります。

  • ナビゲーションバーの左上から [サービス] - [開発者用ツール] - [CodePipeline] をクリックします。
  • パイプライン一覧画面に下記のパイプラインが作成されているのが分かります。
    • AWSProton-<サービス名>-cloudformation-<ランダム文字列>-Pipeline-<ランダム文字列>
  • パイプライン名をクリックします。

GitHub をソースとした CI/CD パイプラインが作成されています。

5. CI/CD パイプラインを利用して、サービスにソースコードをデプロイする

それでは、さっそくアプリケーションをデプロイしましょう。

まずはサービス作成時に指定したリポジトリとブランチを作成します。GitHub のサイトから作業していただいてもいいですが、私は gh コマンドを利用して実施していきます。

$ gh repo create my-service --private -y
✓ Created repository xeres/my-service on GitHub
Initialized empty Git repository in /home/fujy/repos/github.com/xeres/my-service/.git/
✓ Initialized repository in "my-service"
$ cd my-service

ここで、何か適当なアプリケーションを持ってきます。サンプルとして、下記を利用するのがよいでしょう。

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

$ curl -sLO https://github.com/aws-samples/aws-proton-sample-fargate-service/raw/main/Dockerfile
$ curl -sLO https://github.com/aws-samples/aws-proton-sample-fargate-service/raw/main/index.html
$ git add .
$ git commit -a -m 'initial commit'
[master (root-commit) edfc471] initial commit
 2 files changed, 38 insertions(+)
  create mode 100644 Dockerfile
  create mode 100644 index.html
$ git push --set-upstream origin master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 2.09 KiB | 714.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To https://github.com/xeres/my-service.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
  • ナビゲーションバーの左上から [サービス] - [開発者用ツール] - [CodePipeline] をクリックします。
  • パイプライン一覧画面に下記のパイプラインが作成されているのが分かります。
    • AWSProton-<サービス名>-cloudformation-<ランダム文字列>-Pipeline-<ランダム文字列>
  • パイプライン名をクリックします。

GitHub への git push をトリガーに、CI/CD パイプラインが実行されていることが分かります。

パイプラインの全ステージが完了後、再び [ServieEndpoint] に表示されていた URL にアクセスしてください。

AWS Proton のアイコン

AWS Proton のアイコンが表示されたら完成です。

最後に

いかがだったでしょうか。

次回、マルチアカウント編に続く!

脚注
  1. https://kawahara-ci.hatenablog.com/entry/2020/07/29/git_2_28_0 ↩︎

Discussion