IAM Role for service accountの設定

この章では、ALB Ingress Controllerを作成する前準備として、IAM Role for service account の設定を行います。 これより、Amazon EKS 上で起動する Pod に IAM Role をアタッチできるようになります。

具体的には、以下を行います

  • OIDC ID プロバイダーの作成
  • ALB の作成等の権限を付加した IAM Policy の作成
  • ALB Ingress Controller で利用する Kubernetes service account の作成
  • Kubernetes RBAC の作成
  • 作成した IAM Policy に Kubernetes上の service accountを紐付ける操作

OIDC Provider の作成

以下のコマンドを実行し、OIDC ID プロバイダーを作成し、クラスターに関連付けます。本ハンズオンでは、eksctl を利用します。

eksctl utils associate-iam-oidc-provider \
  --cluster eksworkshop-eksctl \
  --region=$AWS_REGION \
  --approve

ALB Ingress Controller 用の IAM ポリシーの作成

ALB Ingress Controller 用の IAM ポリシーを作成します。

aws iam create-policy \
  --policy-name ALBIngressControllerIAMPolicy \
  --policy-document https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/iam-policy.json

作成した IAM Policy 情報が出力されます

Output:


{
    "Policy": {
        "PolicyName": "ALBIngressControllerIAMPolicy",
        "PolicyId": "ANPA5UPUHMRP4ODFXYB5W",
        "Arn": "arn:aws:iam::123456789012:policy/ALBIngressControllerIAMPolicy",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2020-02-21T22:37:49Z",
        "UpdateDate": "2020-02-21T22:37:49Z"
    }
}

Kubernetes Service Account の作成

作成した IAM Policy は後ほど使用するため、環境変数に設定します

export FARGATE_POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`ALBIngressControllerIAMPolicy`].Arn' --output text)
echo ${FARGATE_POLICY_ARN}

以下のコマンドを実行して Kubernetes サービスアカウントを作成します。

eksctl create iamserviceaccount \
  --name alb-ingress-controller \
  --namespace 2048-game \
  --cluster eksworkshop-eksctl \
  --attach-policy-arn ${FARGATE_POLICY_ARN} \
  --approve \
  --override-existing-serviceaccounts

上記のコマンドでは、以下を行っています

  • 指定した IAM Policy をアタッチした IAM Role を作成する CloudFormation Template の Deploy
  • (Kubernetes service account が存在しない場合は) 指定した service account を作成し、上記で作成した IAM role を関連付け
  • (Kubernetes service account が存在する場合は) 指定した service account に対して、上記で作成した IAM role を関連付け

作成された service account の詳細は以下のコマンドで確認できます。

kubectl get sa alb-ingress-controller -n 2048-game -o yaml

Output:


apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/eksctl-eksworkshop-eksctl-addon-iamserviceac-Role1-KI23J8XS8Y3H
  creationTimestamp: "2020-03-07T22:40:34Z"
  name: alb-ingress-controller
  namespace: 2048-game
  resourceVersion: "692979"
  selfLink: /api/v1/namespaces/2048-game/serviceaccounts/alb-ingress-controller
  uid: a85f5574-60c4-11ea-81a5-02920c051794
secrets:
- name: alb-ingress-controller-token-2rbtd

RBAC の作成

先ほど作成した service account(alb-ingress-controller) に必要な権限を付与する Cluster Role と ClusterRoleBinding を作成します

curl -sS  https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/${ALB_INGRESS_VERSION}/docs/examples/rbac-role.yaml \
  | sed 's/namespace: kube-system/namespace: 2048-game/g' \
  | kubectl apply -f -

作成した RBAC は以下のコマンドで確認できます。

kubectl get clusterrole alb-ingress-controller -o yaml
kubectl get clusterrolebinding alb-ingress-controller -o yaml