ALBの3つのターゲットタイプ(Instance, IP, Lambda) + Auto Scaling

目次

ALBの全ターゲットタイプを確認する構成

ALBのターゲットとして指定できるリソースは3種類です。

instance
インスタンス ID で指定されたターゲット。

ip
ターゲットは IP アドレスです。

lambda
ターゲットは Lambda 関数です。

[Target type (ターゲットタイプ)]

今回は3種類のターゲットタイプを実際に構築し、挙動を確認します。

構築する環境

Diagram of three target types of ALB.

4つのALBターゲットグループを作成します。先述の3種類のターゲットタイプごとにグループを作成します。
Instanceタイプに関してだけ、2つのグループを作成します。1つ目はEC2インスタンス、2つ目はEC2 Auto Scalingグループです。

パスベースルーティングを使用して、それぞれのターゲットグループを、1つのALBに関連付けます。URLとターゲットグループの対応は以下の通りです。

  • /:Target Group 1
  • /instance/:Target Group 1
  • /autoscaling/:Target Group 2
  • /ip/:Target Group 3
  • /lambda/:Target Group 4

今回作成するEC2インスタンスは、共通して、Apacheをインストールし、Webサーバとして動作させ、80/tcpでHTTPをリッスンします。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。以下のURLにCloudFormationテンプレートを配置してます。

https://github.com/awstut-an-r/awstut-fa/tree/main/028

テンプレートファイルのポイント解説

各ターゲットタイプごとに、ALBターゲットグループの作成方法を確認します。
なおALBのパスベースルーティングに関しては、以下のページをご確認ください。

あわせて読みたい
ALBのパスベースルーティングで複数のターゲットグループにトラフィックを転送する 【ALBのパスベースルーティング用構成】 ALBはパスベースルーティングに対応しています。 1 つのターゲットグループにリクエストを転送するデフォルトルールを持つリス...

ターゲットタイプ1-1:instance

EC2インスタンス用のALBターゲットグループを確認します。

Resources:
  ALBTargetGroup1:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckPath: !Ref Path1
      HealthCheckPort: traffic-port
      HealthCheckProtocol: HTTP
      Name: !Sub "${Prefix}-ALBTargetGroup1"
      Port: !Ref HTTPPort
      Protocol: HTTP
      Targets:
        - Id: !Ref Instance1
      TargetType: instance
      VpcId: !Ref VPC
Code language: YAML (yaml)

TargetTypeプロパティに「instance」を設定することで、EC2インスタンスをターゲットにします。Targetsプロパティで、対象インスタンスのIDを指定します。
EC2インスタンスをターゲットとする場合、ヘルスチェック系のパラメータ設定が必要です。今回の構成でポイントとなるパラメータは、HealthCheckPathプロパティです。コンテンツを配置する位置を指定します。

ターゲットタイプ1-2:instance(Auto Scaling)

EC2 Auto Scalingグループ用のALBターゲットグループを確認します。

Resources:
  ALBTargetGroup2:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckPath: !Ref Path2
      HealthCheckPort: traffic-port
      HealthCheckProtocol: HTTP
      Name: !Sub "${Prefix}-ALBTargetGroup2"
      Port: !Ref HTTPPort
      Protocol: HTTP
      #Targets:
      TargetType: instance
      VpcId: !Ref VPC
Code language: YAML (yaml)

Auto Scalingグループをターゲットにする場合でも、TargetTypeプロパティに「instance」を設定します。ただしTargetsプロパティは使用しません。これはAuto Scalingグループリソース側の方で、ALBターゲットグループとの関連付けを行うためです。詳細は以下のページをご確認ください。

あわせて読みたい
EC2 Auto Scaling – CPU使用率に基づいてターゲット追跡スケーリング 【EC2 Auto Scaling - CPU使用率に基づいてターゲット追跡スケーリング】 以下のページでEC2 Auto Scalingの基本事項を取り上げました。 https://awstut.com/2022/10/08...

ターゲットタイプ2:ip

IPアドレスベースで、ターゲットを指定する方法を確認します。

Resources:
  ALBTargetGroup3:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckPath: !Ref Path3
      HealthCheckPort: traffic-port
      HealthCheckProtocol: HTTP
      Name: !Sub "${Prefix}-ALBTargetGroup3"
      Port: !Ref HTTPPort
      Protocol: HTTP
      Targets:
        - Id: !Ref Instance2PrivateIp
      TargetType: ip
      VpcId: !Ref VPC
Code language: YAML (yaml)

IPアドレスを指定して、ALBのターゲットとするためには、TargetTypeプロパティに「ip」、TargetsプロパティにそのIPアドレスを設定します。このタイプを設定する上でのポイントは、指定できるIPアドレスに制限があるという点です。

ターゲットの種類が ip の場合、次のいずれかの CIDR ブロックから IP アドレスを指定できます。

・ターゲットグループの VPC のサブネット
・10.0.0.0/8 (RFC 1918)
・100.64.0.0/10 (RFC 6598)
・172.16.0.0/12 (RFC 1918)
・192.168.0.0/16 (RFC 1918)

パブリックにルーティング可能な IP アドレスは指定できません。

[Target type (ターゲットタイプ)]

上記の通り、例えばElastic IPアドレスや、EC2インスタンスに付与できるパブリックIPアドレスといった、グローバルアドレスを指定することはできませんので、ご注意ください。

ターゲットタイプ3:lambda

Lambda用のALBターゲットグループを確認します。

Resources:
  ALBTargetGroup4:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    DependsOn:
      - Permission
    Properties:
      HealthCheckEnabled: false
      Name: !Sub "${Prefix}-ALBTargetGroup4"
      Targets:
        - Id: !Ref FunctionArn
      TargetType: lambda
Code language: YAML (yaml)

TargetTypeプロパティに「lambda」を設定することで、Lambda関数をターゲットにします。Targetsプロパティで、対象の関数のARNを指定します。
Lambda関数をALBターゲットとする上でのポイントは、Port・Protocolプロパティの設定は不要という点です。これらを設定するとエラーが発生しますのでご注意ください。またターゲットがLambda関数の場合、デフォルトではヘルスチェックは無効です。ですからヘルスチェックに関する設定は行いません。

そしてもう1つのポイントは、ALBにLambda関数を呼び出すための権限を付与する必要があるという点です。

  Permission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref FunctionName
      Action: lambda:InvokeFunction
      Principal: elasticloadbalancing.amazonaws.com
Code language: YAML (yaml)

Lambdaのリソースベースのポリシーを作成して、本関数を呼び出す権限を、ALBに付与します。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • ALB:fa-028-ALB
  • ターゲットグループ1:fa-028-ALBTargetGroup1
  • ターゲットグループ2:fa-028-ALBTargetGroup2
  • ターゲットグループ3:fa-028-ALBTargetGroup3
  • ターゲットグループ4:fa-028-ALBTargetGroup4

AWS Management Consoleからも、リソースの作成状況を確認します。
まずALBを確認します。

The ALB has been created successfully.

ALBが作成されました。

次にリスナールールを確認します。

ALB Listener Rules.

URLとターゲットグループの対応を確認できます。

各ターゲットグループを確認します。

ALB Target Group 1 (Instance).
ALB Target Group 2 (Auto Scaling).
ALB Target Group 3 (IP).
ALB Target Group 4 (Lambda).

各ターゲットグループに、ターゲットが登録されていることがわかります。ターゲットタイプごとに、登録されているターゲットの内容が異なる点に注目してください。
例えばインスタンスやAuto Scalingグループを登録したターゲットグループ1および2は、インスタンスIDが表示されています。
IPを指定したターゲットグループ3は、対象のインスタンスに付与されたプライベートアドレスが表示されています。
Lambda関数を指定したターゲットグループ4は、同関数の名前やARNが表示されています。

動作確認

準備が整いましたので、ALBにアクセスします。

まずインスタンスへアクセスします。

ALB Access 1 (Instance).

ターゲットグループ1内のインスタンスから応答がありました。インスタンスをALBのターゲットとして設定できることがわかりました。

次にEC2 Auto Scalingへアクセスします。

ALB Access 2 (Auto Scaling).

ターゲットグループ2内に関連づいている、Auto Scalingグループ内のインスタンスから応答がありました。Auto Scalingを対象とする場合でも、ターゲットタイプをインスタンスに設定すれば、正常にアクセスできることがわかりました。

次にIPアドレスで指定したEC2インスタンスにアクセスします。

ALB Access 3 (IP).

ターゲットグループ3内のインスタンスから応答がありました。IPアドレスを指定することでも、ALBのターゲットにできることがわかりました。

最後にLambda関数へアクセスします。

ALB Access 4 (Lambda).

ターゲットグループ4内のLambda関数から応答がありました。Lambda関数を、ALBのターゲットにできることがわかりました。

まとめ

ALBのターゲットとして指定できるリソース(3種類)について確認しました。
EC2 Auto Scalingをターゲットとする場合、ターゲットタイプをインスタンスに指定すれば良いということを確認しました。

目次