Amazon EKS で ALB Ingress を作成し、ALB Ingress を AWS WAF に関連付けるにはどうすればよいでしょうか。
AWS Load Balancer Controller を使用しながら、Amazon Elastic Kubernetes Service (Amazon EKS) 内に Application Load Balancer (ALB) を作成したいと考えています。その後、ALB Ingress を AWS WAF に関連付けたいと考えています。
簡単な説明
kubernetes.io/ingress.class: alb アノテーションを使用して Ingress オブジェクトが作成されると、AWS Load Balancer Controller は Application Load Balancer を作成します。Ingress リソースは、HTTP または HTTPS トラフィックを Amazon EKS クラスター内の異なるポッドにルーティングするように Application Load Balancer を設定します。AWS WAF を使用して、Application Load Balancer に転送される HTTP または HTTPS リクエストをモニタリングできます。
解決方法
AWS Load Balancer Controller の OIDC プロバイダーと IAM ロールを作成する
1. AWS Identity and Access Management (IAM) OIDC プロバイダーを作成し、OIDC プロバイダーをクラスターに関連付けます。
eksctl utils associate-iam-oidc-provider --region region-code --cluster your-cluster-name --approve
2. AWS Load Balancer Controller の IAM ポリシーをダウンロードする
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/iam_policy.json
注: IAM ポリシーでは、AWS Load Balancer Controller がユーザーに代わって AWS API を呼び出すことを許可します。
3. ステップ 2 でダウンロードしたポリシーを使用して IAM ポリシーを作成します。
aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json
注: ステップ 3 で返されたポリシーの Amazon リソースネーム (ARN) の名前をコピーします。
4. AWS Load Balancer Controller の IAM ロールを作成し、ステップ 2 で作成したサービスアカウントにロールをアタッチします。
eksctl create iamserviceaccount --cluster=your-cluster --namespace=kube-system --name=aws-load-balancer-controller --attach-policy-arn=arn:aws:iam::YOUR_AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts --approve
AWS ALB Ingress Controller for Kubernetes をアンインストールする
AWS Load Balancer Controller は、AWS ALB Ingress Controller for Kubernetes の機能を置き換えます。
AWS ALB Ingress Controller がインストールされているかどうかを確認するには、以下の手順に従ってください。
kubectl get deployment -n kube-system alb-ingress-controller
AWS ALB Ingress Controller がインストールされていない場合は、次の出力が表示されます。
Error from server (NotFound): deployments.apps "alb-ingress-controller" not found
「Helm 3.0.0 を使用して AWS Load Balancer Controller をインストールする」のセクションに進んでください。
- または -
AWS ALB Ingress Controller がインストールされている場合は、次の出力が表示されます。
NAME READY UP-TO-DATE AVAILABLE AGE alb-ingress-controller 1/1 1 1 122d
以下の手順を実行します。
1. AWS ALB Ingress Controller を削除するには、以下の手順に従ってください。
kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
ここで、以下の手順を実行して IAM ポリシーを IAM ロールに追加します。IAM ポリシーは、AWS Load Balancer Controller に AWS ALB Ingress Controller for Kubernetes によって作成されたリソースへのアクセス権を付与します。
1. IAM ポリシーをダウンロードします。
curl -o iam_policy_v1_to_v2_additional.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/iam_policy_v1_to_v2_additional.json
2. IAM ポリシーを作成し、その際に返される ARN を書き留めます。
aws iam create-policy --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy --policy-document file://iam_policy_v1_to_v2_additional.json
3. 前に作成した IAM ロールに IAM ポリシーを添付します。
aws iam attach-role-policy --role-name eksctl-your-role name --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
注: eksctl を使用してロールを作成した場合は、AWS CloudFormation コンソールを使用してロールを探します。eksctl-your-cluster-name-addon-iamserviceaccount-kube-system-aws-load-balancer-controller スタックを選択します。その後、[Resources] (リソース) タブを選択します。ロール名は [Physical ID] (物理 ID) 列に表示されます。AWS マネジメントコンソールを使用してロールを作成した場合、ロール名はユーザーが付与した名前になります。例: AmazonEKSLoadBalancerControllerRole。
Helm 3.0.0 を使用して AWS Load Balancer Controller をインストールする
1. TargetGroupBinding カスタムリソース定義をインストールします。
kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"
2. eks-charts リポジトリを追加します。
helm repo add eks https://aws.github.io/eks-charts
3. クラスターの AWS リージョンに対応するコマンドを使用して、AWS Load Balancer Controller をインストールします。
helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller --set clusterName=your-cluster-name --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller -n kube-system
注: Fargate の Amazon EKS にデプロイする場合は、以下のフラグをコマンドに追加する必要があります。
* --set region=your-region-code * --set vpcId=your-vpc-xxxxxxxx
4. AWS Load Balancer Controller がインストールされていることを確認します。
kubectl get deployment -n kube-system aws-load-balancer-controller
5. 次のアノテーションを使用して、クラスターに Kubernetes Ingress リソースを作成します。
annotations: kubernetes.io/ingress.class: alb
注: AWS Load Balancer Controller はロードバランサーを作成します。Ingress リソースは、HTTP または HTTPs トラフィックをクラスター内の異なるポッドにルーティングするように Application Load Balancer を設定します。
6. [internal] (内部) または [internet-facing] (インターネット向け) アノテーションを追加して、Ingress でロードバランサーを作成する場所を指定します。
alb.ingress.kubernetes.io/scheme: internal
- または -
alb.ingress.kubernetes.io/scheme: internet-facing
注: 内部ロードバランサーを作成する場合は [内部] を選択し、パブリック向けのロードバランサーを作成するには [インターネット向け] を選択します。
サンプルアプリケーションをデプロイする
1. サンプルアプリケーションをデプロイして、ALB Ingress Controller が、Ingress オブジェクトの結果として Application Load Balancer を作成することを検証します。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/examples/2048/2048_full.yaml
2. Ingress リソースが作成され、Application Load Balancer に関連付けられていることを確認します。
kubectl get ingress ingress-2048 -n game-2048
出力例:
NAME HOSTS ADDRESS PORTS AGE ingress-2048 * example-2048game-2048ingr-xxxxxxx.region-code.elb.amazonaws.com 80 2h
Application Load Balancer のアドレスを検証する
1. Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。
2. ナビゲーションバーで、[Region] (リージョン) を選択します。Amazon EKS クラスター用に選択したリージョンと同じリージョンを選択してください。
3. ナビゲーションペインの [LOAD BALANCING] セクションで、[Load Balancers] を選択します。
4. Application Load Balancer のアドレスを検証して、Ingress オブジェクトが Application Load Balancer のリソースを作成したかどうかを確認します。
ウェブ ACL を作成する
ウェブ ACL を作成するときは、Amazon EKS クラスターで使用しているリージョンと同じリージョンを選択し、次の操作を行います。
1. Application Load Balancer にウェブ ACL を関連付けます。
2. リソースタイプとして Application Load Balancer を選択します。
3. ウェブ ACL の Amazon CloudWatch メトリクス名を追加します。
4. ウェブ ACL に任意の条件とルールを追加します。
5. AWS WAF コンソールから AWS WAF ARN をコピーするか、AWS WAF ウェブ ACL JSON ファイルをダウンロードします。
JSON での AWS WAF ウェブ ACL の出力例:
{ "Name": "", "Id": "ea199076-xxx-xxxx-xxxx-xxxxxxxxxxx", "ARN": "arn:aws:wafv2:us-east-2:<Account_Number>:regional/webacl/deployment/41b495a2-xxxx-xxxx-xxxx-xxxx16619441", "DefaultAction": { "Allow": {} }, "Description": "", "Rules": [], "VisibilityConfig": { "SampledRequestsEnabled": , "CloudWatchMetricsEnabled": , "MetricName": "" }, "Capacity": , "ManagedByFirewallManager": }
ALB Ingress に AWS WAF ウェブ ACL ARN アノテーションを追加する
1. ALB Ingress を編集し、alb.ingress.kubernetes.io/wafv2-acl-arn: アノテーションに先ほどコピーした AWS WAF ID を追加します。
kubectl edit ingress/ingress-2048 -n game-2048
Ingress マニフェストの出力例:
apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/wafv2-acl-arn: arn:aws:wafv2:us-east-2:<Account_Number>:regional/webacl/deployment/41b495a2-xxxx-xxxx-xxxx-xxxx16619441 alb.ingress.kubernetes.io/scheme: internet-facing kubernetes.io/ingress.class: alb labels: app: 2048-ingress name: ingress-2048 namespace: game-2048 spec: rules: - http: paths: - backend: serviceName: service-2048 servicePort: 80 path: /* status: loadBalancer: {}

関連するコンテンツ
- 質問済み 2年前lg...
- 質問済み 3年前lg...
- 質問済み 5年前lg...
- 質問済み 3年前lg...
- AWS公式更新しました 3ヶ月前