Auto Scaling グループのメトリクス収集を有効にする - Amazon EKS

このページの改善にご協力ください

本ユーザーガイドの改善にご協力いただけませんか? このページの下部までスクロールし、[GitHub でこのページの編集] を選択します。皆さまにご協力いただくことで、あらゆる人々に使いやすいユーザーガイドになります。

Auto Scaling グループのメトリクス収集を有効にする

このトピックでは、AWS Lambda および AWS CloudTrail を使用して Auto Scaling グループのメトリックス収集を有効にする方法について説明します。Amazon EKS は、マネージドノード用に作成された Auto Scaling グループのグループメトリックス収集を自動的に有効にしません。

Auto Scaling グループのメトリックスを使用して、Auto Scaling グループの変更を追跡し、しきい値にアラームを設定できます。Auto Scaling グループのメトリックスは、Auto Scaling コンソールまたは Amazon CloudWatch コンソールで使用できます。Auto Scaling グループが有効になると、サンプリングされたデータが毎分 Amazon CloudWatch に送信されます。これらのメトリクスの有効化には料金はかかりません。

Auto Scaling グループのメトリクス収集を有効にすることで、マネージド型ノードグループのスケーリングを監視することができるようになります。Auto Scaling グループのメトリクスは、Auto Scaling グループの最小サイズ、最大サイズ、および必要なサイズを報告します。ノードグループ内のノード数が最小サイズを下回った場合にアラームを作成できます。これは、ノードグループに異常があることを示しています。ノードグループサイズを追跡することは、データプレーンの容量が不足しないように最大数を調整する場合にも役立ちます。

マネージド型ノードグループを作成すると、AWS CloudTrail は CreateNodegroup イベントを Amazon EventBridge に送信します。CreateNodegroup イベントと一致する Amazon EventBridge ルールを作成することで、Lambda 関数をトリガーして、マネージド型ノードグループに関連付けられた Auto Scaling グループのグループメトリック収集を有効にします。

マネージド型ノードグループ、CloudTrail、および EventBridge コンポーネントを示す図
Auto Scaling グループのメトリクス収集を有効にするには
  1. Lambda 用に IAM ロールを作成する。

    LAMBDA_ROLE=$(aws iam create-role \ --role-name lambda-asg-enable-metrics \ --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}' \ --output text \ --query 'Role.Arn') echo $LAMBDA_ROLE
  2. Amazon EKS ノードグループを記述し、Auto Scaling グループのメトリックス収集を有効にすることを許可するポリシーを作成します。

    cat > /tmp/lambda-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:DescribeNodegroup", "autoscaling:EnableMetricsCollection" ], "Resource": [ "*" ] } ] } EOF LAMBDA_POLICY_ARN=$(aws iam create-policy \ --policy-name lambda-asg-enable-metrics-policy \ --policy-document file:///tmp/lambda-policy.json \ --output text \ --query 'Policy.Arn') echo $LAMBDA_POLICY_ARN
  3. Lambda の IAM ロールにポリシーをアタッチします。

    aws iam attach-role-policy \ --policy-arn $LAMBDA_POLICY_ARN \ --role-name lambda-asg-enable-metrics
  4. ログを CloudWatch Logs に書き込むために関数が必要とするアクセス許可を含む AWSLambdaBasicExecutionRole 管理ポリシーを追加します。

    aws iam attach-role-policy \ --role-name lambda-asg-enable-metrics \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
  5. Lambda コードを作成します。

    cat > /tmp/lambda-handler.py <<EOF import json import boto3 import time import logging eks = boto3.client('eks') autoscaling = boto3.client('autoscaling') logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): ASG_METRICS_COLLLECTION_TAG_NAME = "ASG_METRICS_COLLLECTION_ENABLED" initial_retry_delay = 10 attempts = 0 #print(event) if not event["detail"]["eventName"] == "CreateNodegroup": print("invalid event.") return -1 clusterName = event["detail"]["requestParameters"]["name"] nodegroupName = event["detail"]["requestParameters"]["nodegroupName"] try: metricsCollectionEnabled = event["detail"]["requestParameters"]["tags"][ASG_METRICS_COLLLECTION_TAG_NAME] except KeyError: print(ASG_METRICS_COLLLECTION_TAG_NAME, "tag not found.") return # Check if metrics collection is enabled in tags if metricsCollectionEnabled.lower() != "true": print("Metrics collection is not enabled in nodegroup tags.") return # Get the name of the associated autoscaling group print("Getting the autoscaling group name for nodegroup=", nodegroupName, ", cluster=", clusterName ) for i in range(0,10): try: autoScalingGroup = eks.describe_nodegroup(clusterName=clusterName,nodegroupName=nodegroupName)["nodegroup"]["resources"]["autoScalingGroups"][0]["name"] except: attempts += 1 print("Failed to obtain the associated autoscaling group for nodegroup", nodegroupName, "Retrying in", initial_retry_delay*attempts, "seconds.") time.sleep(initial_retry_delay*attempts) else: break print("Enabling metrics collection on autoscaling group ", autoScalingGroup) # Enable metrics collection in the autoscaling group try: enableMetricsCollection = autoscaling.enable_metrics_collection(AutoScalingGroupName=autoScalingGroup,Granularity="1Minute") except: print("Unable to enable metrics collection on nodegroup=",nodegroup) print("Enabled metrics collection on nodegroup", nodegroupName) EOF
  6. デプロイパッケージを作成します。

    cd /tmp zip function.zip lambda-handler.py
  7. Lambda 関数を作成する。

    LAMBDA_ARN=$(aws lambda create-function --function-name asg-enable-metrics-collection \ --zip-file fileb://function.zip --handler lambda-handler.lambda_handler \ --runtime python3.9 \ --timeout 600 \ --role $LAMBDA_ROLE \ --output text \ --query 'FunctionArn') echo $LAMBDA_ARN
  8. EventBridge ルールを作成します。

    RULE_ARN=$(aws events put-rule --name CreateNodegroupRuleToLambda \ --event-pattern "{\"source\":[\"aws.eks\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventName\":[\"CreateNodegroup\"],\"eventSource\":[\"eks.amazonaws.com\"]}}" \ --output text \ --query 'RuleArn') echo $RULE_ARN
  9. ターゲットとしての Lambda 関数を追加します。

    aws events put-targets --rule CreateNodegroupRuleToLambda \ --targets "Id"="1","Arn"="$LAMBDA_ARN"
  10. EventBridge が Lambda 関数を呼び出すことを許可するポリシーを追加します。

    aws lambda add-permission \ --function-name asg-enable-metrics-collection \ --statement-id CreateNodegroupRuleToLambda \ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn $RULE_ARN

Lambda 関数は、ASG_METRICS_COLLLECTION_ENABLEDTRUE に設定してタグ付けしたマネージド型ノードグループの Auto Scaling グループのメトリック収集を有効にします。[Auto Scaling group metrics collection] (Auto Scaling グループのメトリクス収集) が有効になっていることを確認するには、Amazon EC2 コンソールで、関連する Auto Scaling グループに移動します。[Monitoring] (モニタリング) タブで、[Enable] (有効化) チェックボックスが有効になっているはずです。