ALBの全ターゲットタイプを確認する構成
ALBのターゲットとして指定できるリソースは3種類です。
instance
インスタンス ID で指定されたターゲット。ip
ターゲットは IP アドレスです。lambda
[Target type (ターゲットタイプ)]
ターゲットは Lambda 関数です。
今回は3種類のターゲットタイプを実際に構築し、挙動を確認します。
構築する環境
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のパスベースルーティングに関しては、以下のページをご確認ください。
ターゲットタイプ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ターゲットグループとの関連付けを行うためです。詳細は以下のページをご確認ください。
ターゲットタイプ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スタックを作成します。スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- ALB:fa-028-ALB
- ターゲットグループ1:fa-028-ALBTargetGroup1
- ターゲットグループ2:fa-028-ALBTargetGroup2
- ターゲットグループ3:fa-028-ALBTargetGroup3
- ターゲットグループ4:fa-028-ALBTargetGroup4
AWS Management Consoleからも、リソースの作成状況を確認します。
まずALBを確認します。
ALBが作成されました。
次にリスナールールを確認します。
URLとターゲットグループの対応を確認できます。
各ターゲットグループを確認します。
各ターゲットグループに、ターゲットが登録されていることがわかります。ターゲットタイプごとに、登録されているターゲットの内容が異なる点に注目してください。
例えばインスタンスやAuto Scalingグループを登録したターゲットグループ1および2は、インスタンスIDが表示されています。
IPを指定したターゲットグループ3は、対象のインスタンスに付与されたプライベートアドレスが表示されています。
Lambda関数を指定したターゲットグループ4は、同関数の名前やARNが表示されています。
動作確認
準備が整いましたので、ALBにアクセスします。
まずインスタンスへアクセスします。
ターゲットグループ1内のインスタンスから応答がありました。インスタンスをALBのターゲットとして設定できることがわかりました。
次にEC2 Auto Scalingへアクセスします。
ターゲットグループ2内に関連づいている、Auto Scalingグループ内のインスタンスから応答がありました。Auto Scalingを対象とする場合でも、ターゲットタイプをインスタンスに設定すれば、正常にアクセスできることがわかりました。
次にIPアドレスで指定したEC2インスタンスにアクセスします。
ターゲットグループ3内のインスタンスから応答がありました。IPアドレスを指定することでも、ALBのターゲットにできることがわかりました。
最後にLambda関数へアクセスします。
ターゲットグループ4内のLambda関数から応答がありました。Lambda関数を、ALBのターゲットにできることがわかりました。
まとめ
ALBのターゲットとして指定できるリソース(3種類)について確認しました。
EC2 Auto Scalingをターゲットとする場合、ターゲットタイプをインスタンスに指定すれば良いということを確認しました。