AWS分散負荷テストは、テスト対象のサービスに大量のリクエストを発生させて、パフォーマンスにどのような影響が起きるかを検証できるツールです。
このツールを使用してfargateで作成したWebサイトへ負荷テストをかける際に、PrivateLinkを使って、負荷テストのVPCからテスト対象のVPCへインターネットを経由せずに実行してみます。
概要
AWS分散負荷テスト環境の作成
負荷テスト環境の作成はCloudformationで簡単に作成可能です。
https://aws.amazon.com/jp/solutions/implementations/distributed-load-testing-on-aws/
上記リンクの「AWSコンソールで起動する」をクリックし、AWSコンソールへログインすると、Cloudformationの画面に飛びます。
必要に応じてリージョンの変更などを行います。
Console Administrator Emailは、受信可能なメールアドレスを入力します。
入力したメールアドレスに負荷テストのフロントエンド画面へのログイン初期パスワードが送られます。
既存のVPCに負荷テストツールの環境を作成したい場合は
「Enter values here to use your own existing VPC」に入力します。
新規にVPCを作成する場合は下段の
「Or have the solution create a new AWS Fargate VPC」に入力します。
作成するVPCのCIDRブロックは適当な内部IPでよい場合はそのまま次へ進みます。
スタックの作成を行い、10分から15分ほど待ちますと入力したメールアドレスでAWSからメール受信するので、ログインできることを確認します。
以上で、AWS分散負荷テスト環境の構築ができました。
Fargateでテスト対象となるWEBサイトの作成
とくにFargateではなくEC2なサーバ群でもよいのですが、ポイントとしてはロードバランサにNLBを使うところです。後述のVPCエンドポイントサービスに指定できるのは2021年12月現在、NLBだけです。
あとで簡単に削除しやすいようにCloudformationで作成してみます。
なお、VPCとSubnetは作成済みとします。
Fargateで作成する都合上、VPCにはインターネットゲートウェイを紐づけておいてください。WebサーバはNginxイメージを使用してみます。
AWSTemplateFormatVersion: '2010-09-09'
Description: Create NLB and Faragate
Parameters:
VpcId:
Type: AWS::EC2::VPC::Id
Default: <VPCID>
SubnetIds:
Type: List<AWS::EC2::Subnet::Id>
Default: <SubnetID>,<SubnetID>
Port:
Type: Number
Default: 80
Resources:
ECSCluster:
Type: AWS::ECS::Cluster
Properties:
ClusterName: Test-Cluster
ECSTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
- Name: Test-Container
Image: nginx:latest
PortMappings:
- ContainerPort: !Ref Port
HostPort: !Ref Port
Protocol: tcp
Essential: true
Cpu: 256
ExecutionRoleArn: !Sub arn:aws:iam::${AWS::AccountId}:role/ecsTaskExecutionRole
Family: Test-Task
Memory: 512
NetworkMode: awsvpc
RequiresCompatibilities:
- FARGATE
ECSService:
Type: AWS::ECS::Service
DependsOn:
- ECSCluster
- ECSTaskDefinition
- SecurityGroup
- TargetGroup
- LoadBalancerListener
Properties:
Cluster: !Ref ECSCluster
DesiredCount: 1
LaunchType: FARGATE
LoadBalancers:
- ContainerName: Test-Container
ContainerPort: !Ref Port
TargetGroupArn: !Ref TargetGroup
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: ENABLED
SecurityGroups:
- !Ref SecurityGroup
Subnets: !Ref SubnetIds
ServiceName: Test-Service
TaskDefinition: !Ref ECSTaskDefinition
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: Test-SecurityGroup
GroupDescription: Test-SecurityGroup
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: !Ref Port
ToPort: !Ref Port
CidrIp: 0.0.0.0/0
VpcId: !Ref VpcId
LoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: Test-NLB
Subnets: !Ref SubnetIds
Scheme: internet-facing
Type: network
LoadBalancerListener:
Type: AWS::ElasticLoadBalancingV2::Listener
DependsOn:
- LoadBalancer
- TargetGroup
Properties:
LoadBalancerArn: !Ref LoadBalancer
Port: !Ref Port
Protocol: TCP
DefaultActions:
- Type: forward
TargetGroupArn: !Ref TargetGroup
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: Test-targetgroup
VpcId: !Ref VpcId
Port: !Ref Port
Protocol: TCP
TargetType: ip
Cloudformationでスタックの作成が完了したら、NLBのDNS名を確認しアクセスできるか確認してみます。
VPCエンドポイントサービスの作成
AWS分散負荷テストのVPCから、インターネットを経由せずWEBサイトのVPCへ接続(AWS Private Link)するためNLBのVPCエンドポイントサービスを作成します。
エンドポイントサービスの作成が成功したら、サービス名をコピーしておきます。
次にAWS分散負荷テストのVPC内に、エンドポイントを作成します。
「サービス名を名前で検索」を選択し、先ほどコピーしたサービス名を貼り付けて、検証します。
VPCはAWS分散負荷テストのVPCを選択し、エンドポイントの作成を行います。
負荷テストの実行
受信したメールのURLへログインし、「CREATE TEST」をクリックします。
- Name : 任意の名前
- Description : 任意の説明
- Task Count : 負荷をかける側のコンテナ数
- Concurrency : コンテナ毎の同時接続数
- Ramp Up : Concurrency 数に達するまでの時間(分)
- Hold for : Concurrency 数を保持する時間(分)
- HTTP endpoint under test : メモしたエンドポイントをドメインに設定したURL
「Ramp Up」の時間に達するまでにエラーが発生する場合は、その時点が限界点付近ということがわかります。また、オートスケーリングを設定している場合はオートスケーリングが正しく動作するかを確認します。
「Hold for」は、最大接続数の状態でWebサイトのリソースがどのように変化するのか(リソースリーク、メモリリークなど)を確認する意味もあります。
通信費は抑えられるのか?
例として転送量1TB(1カ月)で考えてみます。
PrivateLinkを使用した場合
VPCエンドポイントは、作成するだけで0.014USD/時間の費用が掛かります。1ヵ月で約10USD(0.014USD×720時間)くらいです。
通信料金は最初の1 PBまで0.01 USD/GBなので、約10USDとなります。
10USD+10USD=20USD
インターネットを経由した場合
10TB未満までは$0.114/GBとなるので
114USD
まとめ
ロードバランサーにNLBを使用することで、PrivateLinkを使用してVPC間通信で負荷分散テストを実行できることがわかりました。
通信費は約1/5程度になります。
利用例としては、インターネット公開しないWebサービスなどへの負荷テストが考えられます。
負荷テストの具体的なノウハウは、別の機会にまとめてみたいと思います。