AmazonLinux2023とネストされたスタック(CloudFormation)を使用してWeb3層アーキテクチャを構築してみた!【NestedStack】

AWS

はじめに

今回は、Web3層アーキテクチャをAmazonLinux2023とCloudFormationを使用して作成していきます。

CloudFormationについては、通常のスタックを複数作成する構築手法ではなく、ネステッドスタックを使って、構築手順をより簡素化した手法で構築していきます。

構成図

事前準備

必要なリソースを準備しておきます。

S3バケットを用意する

ネストされたスタックは、通常、複数のスタックを作成するところを親スタック(スタックを作成するスタック)となるスタックを作成するだけで、子スタックに当たる、配下の全てのスタックを作成することができます。(スタックスタック言い過ぎw)

子スタックの素材になるYAMLテンプレートは、S3バケットに保存して、親スタックのYAMLテンプレートからParametersセクションで指定します。

まずは、S3バケットをCloudFormationで作成しておきます。

CloudFormationテンプレートは以下にございます。
ダウンロードしてデスクトップなど任意のフォルダに保存します。
※その他のファイルも後述の手順で使用するためダウンロードしておきます

kosments/basic-struct-by-nested-stack
Contribute to kosments/basic-struct-by-nested-stack development by creating an account on GitHub.

スタックの作成

早速、CloudFormationを使用してリソースを作成していきます。
手順は、以下の通りで、リンクにも詳細がございます。

  1. CloudFormation画面を開きスタックの作成>新しいソースを使用(標準)を選択
  2. テンプレートの準備完了>テンプレートファイルのアップロードを選択して、保存したymlを選択
  3. スタックに任意の名称を入力して、パラメータは環境に合わせて変更>次へを選択。※後述の手順に従う場合、デフォルト値でOK
  4. スタックオプションは特に変更せず、次へを選択
  5. レビュー画面を確認して送信を選択

手順に従い、スタックを送信すると以下のように数分でS3バケットが作成されます。

子スタックをS3バケットに保存する

test-structure階層に保存されているスタックを全て、作成したS3バケットに保存しておきます。

下記の手順を参考にします。

ネステッドスタックを用いて構築する

CloudFormation:YAMLテンプレートのポイント

YAMLテンプレートのポイントを記述します。

  • Parameters:テンプレートで使用するパラメータを定義します。ここでは、各リソーススタックのテンプレートURLと、RDSのパスワードが定義されています。
  • Resources:作成するAWSリソースを定義します。各リソースはAWS CloudFormationスタックとして定義されており、それぞれのスタックは特定のAWSリソース(VPC、セキュリティグループ、RDS、EC2、ALB)を作成します。各スタックは、他のスタックが作成された後に作成されるように依存関係が定義されています(DependsOn属性)。
  • Outputs:スタックの出力値を定義します。これらの値は、スタックが作成された後に参照できます。ここでは、各リソーススタックからの出力値(VPC、セキュリティグループ、RDSエンドポイント、EC2インスタンス、ALBなど)が定義されています。

実際にスタックを作成する

必要な子スタック用のYAMLテンプレートをS3バケットに保存できたら親スタックを作成していきます。

DBパスワードは、Noecho属性でマスクして、手動入力しておきます。あとで、EC2からRDSにログインする際に使用するので、控えておきましょう。
DBのパスワードは非常に重要な情報になりますので、実際の本番環境であれば、SeacretsManagerなどを使ってセキュアに管理することが推奨されます。

パラメータを入力したら、ステップ3の設定は特に変更せず、ステップ4で送信します。

スタックがVPC→SecurityGroup→RDS→EC2→ALBの順で作成されます。各スタックが並列で作成されるわけではないですが、大元のスタックを作成するだけであとは待つだけというのは楽ですね。

ネットワーク周りに当たるVPC,SecurityGroupは1分程度で作成されました。
続いてRDSですが、こちらはコンソールから作成する時と同様に10-20分ほどかかります。

5つ全てのスタックの作成が完了しました。
25分程度経過しました。
やはりRDSの作成だけで20分程度経過していますね。。
ですが、コンソールでポチポチしたり、直前のスタック作成を待って次のスタックを作成する手間がない点はよいですね!

動作検証

Webサーバーにアクセスする

Webサーバーにアクセスできることを確認します。

まずは、ALBからEC2へのトラフィックを負荷分散するためのヘルスチェックが問題ないことを確認しておきます。
ターゲットグループにEC2が追加されており、正常なホストが2になっている(ヘルスチェックが成功している)ことが確認できます。

ALBのDNS名をコピーして、任意のブラウザのアドレスバーに貼り付けて、アクセスしてみます。
下記の通り、テンプレートで各EC2のindex.phpに記述した内容が表示されており、Webサーバーにアクセスできていることが確認できます。

何度かページをリロードすると、ALBが1cに作成したEC2にもトラフィックを振り分けており、アクセスできていることがわかります。

RDSにアクセスする

続いて、EC2からRDSにログインできることを確認します。

作成したRDSのコンソールを開き、エンドポイントに記載されている以下のようなエンドポイント名をコピーしておきます。

dev-test-project-db.aaa.ap-northeast-1.rds.amazonaws.com

EC2へは、SSM SessionManagerを使用します。
作成したEC2のコンソールを開き、接続を選択します。
4パターンの接続方法のガイドが出ますので、セッションマネージャーを選択して接続を押下します。

コンソール画面が表示されたら、以下のコマンドを実行します。

  • 注意事項
    • -hの後ろには、上記でコピーしたRDSのエンドポイント名を使用してください
    • -u の後ろは、RDSコンソールにおけるマスターユーザ名を入力してください。この記事で掲載しているGitHubからダウンロードしたコードをそのまま使う場合は、変更不要です。
mariadb -h dev-test-project-db.aaa.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p

Enter Passwordと表示されますので、親スタック作成時に入力したパスワードを入力します。マスクされて画面上見えないですが、入力されています。全角になっていないかなど注意してください。
ログインできると下記のように表示されます。
もう片方のEC2からも同様の方法でアクセスできます。

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 8.0.33 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

まとめ

今回は、ネステッドスタックを使用して、WebサーバーとDBを作成しました。
複数のYAMLテンプレートにまたがる構成を一つのスタックを作成するだけで構築できる点が非常に楽で素晴らしいですね。
複数のLambda関数をAPIgatewayと併せて作成したり、複雑な構成を展開、検証する際に重宝しそうですね!
最後までご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました