Amazon EKS で ALB Ingress を作成して、その ALB Ingress を AWS WAF に関連付けるにはどうすればよいですか?

最終更新日: 2021 年 5 月 7 日

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.1.3/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 Load Balancer Controller がインストールされているかどうかを確認します。

kubectl get deployment -n kube-system alb-ingress-controller

AWS Load Balancer Controller がインストールされていない場合は、次の出力が表示されます。

Error from server (NotFound): deployments.apps "alb-ingress-controller" not found

Helm 3.0.0 を使用して AWS Load Balancer Controller をインストールする」のセクションに進んでください。

- または -

AWS Load Balancer Controller がインストールされている場合は、次の出力が表示されます。

NAME                   READY UP-TO-DATE AVAILABLE AGE
alb-ingress-controller 1/1   1          1         122d

以下の手順を実行します。

1.    AWS Load Balancer 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.1.3/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.1.3/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 ID をコピーするか、AWS WAF ウェブ ACL JSON ファイルをダウンロードします。

JSON での AWS WAF ウェブ ACL の出力例:

{
  "Name": "",
  "Id": "ea199076-xxx-xxxx-xxxx-xxxxxxxxxxx",
  "ARN": "",
  "DefaultAction": {
    "Allow": {}
  },
  "Description": "",
  "Rules": [],
  "VisibilityConfig": {
    "SampledRequestsEnabled": ,
    "CloudWatchMetricsEnabled": ,
    "MetricName": ""
  },
  "Capacity": ,
  "ManagedByFirewallManager": 
}

ALB Ingress に AWS WAF ウェブ ACL アノテーションを追加する

1.    ALB Ingress を編集し、先ほどコピーした AWS WAF ID を持つ alb.ingress.kubernetes.io/waf-acl-id: アノテーションを追加します。

kubectl edit ingress/ingress-2048 -n game-2048

Ingress マニフェストの出力例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/waf-acl-id:  ea199076-xxx-xxxx-xxxx-xxxxxxxxxxx
    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: {}

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?