AWSのElastic Kubernetes Service (EKS)を使ってNextcloudをデプロイしてみた ※構築手順付き

2022年8月31日掲載

キービジュアル

これまでAlibabaCloudMicrosoft AzureGoogle CloudのKubernetesでNextcloudを構築する手順を紹介しました。

今回は同じアプローチながら、AWSのEKSを使って、Nextcloudを構築してみたいと思います。AlibabaCloud、Microsoft Azure、Google Cloudと比較して構築手順が複雑です。注意点もいくつかありますので、順を追って説明していきたいと思います。

目次

概要構成図

AWSのElastic Kubernetes Service(EKS)上でのNextcloudのデプロイとして、全体構成図は次の通りになります。

EKSによるNextcloud構築手順 - 1.事前準備

筆者はWindows PCで操作するため、Windowsでパッケージ管理ツールのChocolateyをインストールします。

◆Chocolatelyのインストール

$ @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin“

Chocolateyのインストールが完了したら、EKS で Kubernetes クラスターを作成および管理するためにeksctlというコマンドラインツールをインストールします。

◆eksctlインストール

$ chocolatey install -y eksctl aws-iam-authenticator

$ eksctl version

最後にAWS CLIをインストールします。本記事では説明をできるだけ簡略化するために、AWS CLIを使ってコンソールでGUI操作するより素早くクラスターを構築、操作します。

◆aws cli設定

$ aws configure

EKS による Nextcloud 構築手順 - 2.クラスタ作成

cluster.yamlファイルを作成します。

apiVersion: eksctl.io/v1alpha5

kind: ClusterConfig

metadata:

  name: <cluster名>

  region: ap-northeast-1

nodeGroups:

   - name: ng1

     desiredCapacity: 2

     instanceType: t2.micro

     ssh:

    publicKeyName: <PublicKey名>

 

   - name: ng-mixed

     minSize: 1

     maxSize: 3

     instancesDistribution:

    maxPrice: 0.017

    instanceTypes: ["t2.micro"] # At least one instance type should be specified

    onDemandBaseCapacity: 0

    onDemandPercentageAboveBaseCapacity: 50

    spotInstancePools: 2

     ssh:

      publicKeyName: <PublicKey名>

クラスタを作成します。

$ eksctl create cluster -f cluster.yaml

kubectlのconfigを取得します。

$ aws eks --region ap-northeast-1 update-kubeconfig --name <クラスター名>

OIDCを作成します。

$ eksctl utils associate-iam-oidc-provider --cluster <クラスター名> --approve

作成したOIDCを確認します。

$ aws iam list-open-id-connect-providers

その結果、出力結果は次のようになっていると思います。

太字は個人アカウントごとに変わりますので注意してください。

{

    "OpenIDConnectProviderList": [

    {

        "Arn": "arn:aws:iam::<IAM> :oidc-provider/oidc.eks.ap-northeast-1.amazonaws.com/id/<id>"

    }

    ]

}

EKS による Nextcloud 構築手順 - 3.権限設定

Policyファイルを取得します。

$ curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

Policyを作成します。

$ aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document iam-policy.json

Roleを作成します。

$ aws iam create-role --role-name AmazonEKSLoadBalancerControllerRole --assume-role-policy-document file://"load-balancer-role-trust-policy.json"

load-balancer-role-trust-policy.jsonの中身に以下のIAM設定情報を貼り付けます。

{

"Version": "2012-10-17",

"Statement": [

{

"Effect": "Allow",

"Principal": {

"Federated": "arn:aws:iam::306197006344:oidc-provider/oidc.eks.ap-northeast-1.amazonaws.com/id/240DB07EE3C2028B363325018948D3F9"

},

"Action": "sts:AssumeRoleWithWebIdentity",

"Condition": {

"StringEquals": {

"oidc.eks.ap-northeast-1.amazonaws.com/id/240DB07EE3C2028B363325018948D3F9:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"

}

}

}

]

}

PolicyはRoleに適応します。

$ aws iam attach-role-policy --policy-arn arn:aws:iam::306197006344:policy/AWSLoadBalancerControllerIAMPolicy --role-name AmazonEKSLoadBalancerControllerRo

EKS による Nextcloud 構築手順 - 4.Ingressインストール

Cert-managerをインストールします。

$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.8.0/cert-manager.yaml

ALBコントローラーインストール用YAMLファイルをダウンロードします。

$ curl -Lo ingress-controller12.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.1/v2_4_1_full.yaml

ダウンロードしたingress-controller.yamlを編集します。

クラスタ名を変更します。

 spec:

  containers:

  - args:

    - --cluster-name=<クラスター名>

    - --ingress-class=alb

ServiceAccountの設定を以下に変更します。

apiVersion: v1

kind: ServiceAccount

metadata:

  labels:

    app.kubernetes.io/component: controller

    app.kubernetes.io/name: aws-load-balancer-controller

  annotations:

    eks.amazonaws.com/role-arn: arn:aws:iam::306197006344:role/AmazonEKSLoadBalancerControllerRole

  name: aws-load-balancer-controller

  namespace: kube-system

ALBコントローラーをインストールします。

$ kubectl apply -f ingress-controller.yaml

ALBコントローラーがインストールされたことを確認します。

$ kubectl get deployment -n kube-system aws-load-balancer-controller

EKS による Nextcloud 構築手順 - 5.Nextcloudデプロイ

https.yamlに以下の内容を貼り付けます。

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: nextcloud-pv-claim

  labels:

    app: nextcloud

spec:

  accessModes:

  - ReadWriteOnce

  resources:

    requests:

   storage: 10Gi

---

apiVersion: v1

kind: Service

metadata:

  name: nextcloud

  labels:

    app: nextcloud

spec:

  ports:

  - port: 80

    targetPort: 80

  selector:

    app: nextcloud

    tier: frontend

  type: ClusterIP

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: nextcloud

  labels:

    app: nextcloud

spec:

  selector:

    matchLabels:

   app: nextcloud

   tier: frontend

  strategy:

    type: Recreate

  template:

    metadata:

   labels:

     app: nextcloud

     tier: frontend

    spec:

   containers:

   - image: nextcloud:latest

     name: nextcloud

     env:

     - name: OVERWRITEHOST

       value: albnextcloud.sbcicp1.net

     - name: OVERWRITEPROTOCOL

       value: https

     ports:

     - containerPort: 80

       name: nextcloud

     volumeMounts:

     - name: nextcloud-ps

       mountPath: /var/www/html

   volumes:

   - name: nextcloud-ps

     persistentVolumeClaim:

       claimName: nextcloud-pv-claim

---

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: nextcloudingress

  namespace: default

  annotations:

    kubernetes.io/ingress.class: alb

    alb.ingress.kubernetes.io/scheme: internet-facing

    alb.ingress.kubernetes.io/target-type: ip

    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:306197006344:certificate/09fd3371-93cd-4315-b6c5-00bab743e671

    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'

spec:

  tls:

  - hosts:

    - albnextcloud.sbcicp1.net

    secretName: sbcicp1.net

  rules:

    - host: albnextcloud.sbcicp1.net

   http:

     paths:

       - backend:

           service:

             name: nextcloud

             port: 

               number: 80

         path: /

         pathType: Prefix

Nextcloudをデプロイします。

$ kubectl apply -f https.yaml

以下の通り、「0/3 nodes are available: 3 Too many pods.」でもNodeが足りないとエラーが発生します。

Nodeを拡張します。

$ eksctl scale nodegroup --cluster=<クラスター名> --nodes=3 --name=ng-mixed

一旦PODを削除します。

POD自動で作成されますので、以下の通り、今回は正常に起動されました。

EKS による Nextcloud 構築手順 - 6.DNS登録

DNS登録作業をします。

$ kubectl get ingress

EKS による Nextcloud 構築手順 - 7.アクセス

上記DNS登録ができたら、FQDNをタブバーのURLへ入力するとページが表示されます。

ハマったポイント

Ingressを作成する際、以下のエラーが発生。

     Failed build model due to ingress: default/nextcloudingress5: multiple certificates found for host: albnextcloud.sbcicp1.net, certARNs: [arn:aws:acm:ap-northeast-1:306197006344:certificate/c0ba735f-8051-450c-a53a-d269ea19506b arn:aws:acm:ap-northeast-1:306197006344:certificate/5b0b3fea-edf3-4e83-8dbb-db55eb290e00 arn:aws:acm:ap-northeast-1:306197006344:certificate/09fd3371-93cd-4315-b6c5-00bab743e671]

Certificate Managerに同じドメインの証明書が多数存在していたことが原因だったようです。

期限切れの証明書が残っていました。

対策:

IngressのYAMLに以下の証明書を指定すると問題なくIngressを作成できます。

    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:<IAM>:certificate/xxxxxxxxxxxxxxxxxxxxxxxxxx

そのほか注意点①

ingress controllerをデプロイする際、以下のエラーが表示されますが、気にしないでそのまま進められます。

error: unable to recognize "ingress-controller.yaml": no matches for kind "IngressClassParams" in version "elbv2.k8s.aws/v1beta1"

そのほか注意点②

AWSではIngress Controllerのインストールが複雑です。権限設定はStep by Stepで設定が必要です。

Ingressの設定をミスってしまい、一から作りなおしたい場合、kubectl delete ingressのコマンドでは削除できません。AWSコンソール:EC2のロードバランサーの画面で手動でロードバランサーを削除してから、kubectl delete ingressで削除できます。

そのほか注意点③

クラスタを削除する際、AWSコンソールでクラスタを削除した場合、実際のリソース(ロードバランサー、EC2等)が削除されないので、eksctl delete clusterで削除したほうがいいです。

<参考>
Amazon EKS クラスターを削除できないのはなぜですか(AWS ナレッジセンター)?

さいごに

Nextcloudはオフィス版ITとして非常に便利です。別途記事にあるように、安価であるAlibaba CloudやGoogle Cloud、Azureなどにも構築できるため、クラウドベンダーを問わずにオフィス版ITとして様々な運用を行うことができます。

Special thanks to lin/bob.

関連サービス

Amazon Web Services(AWS)

ソフトバンクはAWS アドバンストティアサービスパートナーです。

「はじめてのAWS導入」から大規模なサービス基盤や基幹システムの構築まで、お客さまのご要望にあわせて最適なAWS環境の導入を支援します。

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません