はじめに
機能追加で、システム全体の設計から任されることになり、所属プロジェクトのシステムのAWSの構成を理解しようと思いました。
簡単に私の前提知識を整理しておきます
- モバイルアプリをメインで開発
- AWSの知識はCloudPractitionerに合格したので、サービスの概要は理解している程度
- AWSコンソールは業務でたまに触るくらい。S3のファイルを取得したり、DBに接続するため設定を確認したりとか
この状態からどのようにシステムを理解していったか手順を書いていきます。
方針
AIに相談し、リクエストの流れに沿って辿るのが一番わかりやすいと回答をもらいました。自分自身もそうだろうなと思っていたので、リクエストの流れを追い、どの順番でどのようなことをしているか調査していく方針にしました。
入口を見つける
リクエストが来た時、一番最初に何をしているか確認するため、システムのドメイン(example.com)を手がかかりにたどっていきます。
ドメインが登録されているのはDNSなので、AWSだとRoute53を最初に確認します。
ホストゾーンにレコードが登録されているので、確認したいドメインのルーティング先を確認します。
- CloudFrontの場合は、xxxxx.cloudfront.netというのが登録されていて、Route53 -> CloudFrontという流れで通信が始まります。
- ALBの場合は、xxx.ap-northeast-1.elb.amazonaws.comというのが登録されていて、Route53 -> ALBという流れで通信が始まります。
xxxxx.cloudfront.netと登録されていても、CloudFrontにない場合があります。
その場合は、AWS Amplifyを使っている可能性が高いそうです。
CloudFrontから次の経路
次は、CloudFrontのディストリビューションを確認しました。
Domain nameというカラムにRoute53で確認したルーティング先が一致します。
対象のディストリビューションのビヘイビアを確認します。
Path patternを確認し、どのパターンならどこに送信するのか確認します。
/api/*というパターンが、XXXという名前のオリジンに送信していることがわかったので、オリジンのタブを確認しました。
対象のオリジンドメインにXXX.us-east-1.elb.amazonaws.comが設定されていてるので、APIを実行した時の経路は、CloudFront -> ELBという流れになるようです。
ELBから次の経路
対象のELBを確認すると、リスナーとルールには、HTTPS:443のリスナーが一つ登録されていて、複数のルールが登録されていました。
アクションの部分には、Cognitoで認証とEC2のターゲットグループへの転送が設定されています。
APIとWebアプリへのアクセスは、違うEC2のターゲットグループに転送されていましたが、流れを整理すると、ELBからEC2のターゲットグループへと転送されています。
EC2のターゲットグループから次の経路
対象のターゲットグループを確認すると、登録済みターゲットにターゲットが登録されています。
ここで、EC2のインスタンスIDが表示されていればすぐに特定できるのですが、IPアドレスの場合は下記の手順が必要です
- IPアドレスをコピーする
- EC2 - ネットワークインターフェースに遷移し、IPアドレスで対象のネットワークインターフェースを検索
- 詳細でアタッチされているEC2を確認する
ただ、私のシステムだとEC2が使われているわけではなく、下記の手順で追っていく必要がありました。
- ネットワークインターフェースの詳細の説明を確認し、
VPC Endpoint Interface vpce-XXXXのvpce-XXXXの部分をコピー - VPC - エンドポイントに遷移し、コピーした文字列で検索し、対象のエンドポイントを確認
- 対象のエンドポイントの詳細でサービス名を確認し、何のサービスか特定する
私のシステムの場合はS3になってました。
バケット名はどこで設定しているのかわからなかったのですが、ドメイン名とバケット名が同じなら指定しなくていいみたいです。
ただ、バケット名を別の名前にしたい場合とかはCloudFrontで書き換えることが多いみたいです。
また、APIの方は同じようにネットワークインターフェースを追うと、arn:aws:ecs:us-east-1:XXXX:attachment/XXXというようにECSにアタッチされていたので追っていきます
ECSから次の経路
ECS - クラスター - タスクでタスク一覧を確認し、IPアドレスが同じものを選択
タスク定義を確認し、どのようなコンテナなのか調査する。
私のシステムではJavaのAPIサーバーだとわかりました。