EKSクラスター内のPODからkubectlコマンドを使用してS3コマンド実行

お疲れ様です。
 
今回は、Kubernetesの" kubectlコマンド "を使用して、EKSクラスター内の POD から S3 コマンドを実行する方法について紹介していきます。
 

kubctlとは

Kubernetesが提供する、 kubernetes APIを使用してKubernetesクラスターのコントロールプレーンと通信するためのコマンドラインツールです。

kubectlコマンドラインツールを使うと、Kubernetesクラスターを制御できます。環境設定のために、kubectlは、$HOME/.kubeディレクトリにあるconfigという名前のファイルを探します。他のkubeconfigファイルは、KUBECONFIG環境変数を設定するか、–kubeconfigフラグを設定することで指定できます。

引用 Kubernetes 公式サイト

 

前提条件

踏み台サーバー(Linux)から、kuectlコマンドを実行する想定とします。

  • EKSクラスター作成済み
  • S3バケット作成済み
  • kubectlインストール済み
  • AWS CLIインストール済み
  • OIDCプロバイダー作成済み
    ※参考 AWS公式ドキュメント
  • EKSクラスターとOIDCプロバイダー連携済み
    ※参考 AWS公式ドキュメント
     

簡単なイメージ図は以下のようになります

 

1. Namespace 作成

Service Account と PODを作成する Namespace 作成
 
Namespace 作成コマンド

kubectl create ns 【任意の名前】

Namespace 一覧確認コマンド

kubectl get namespace

 

2. IAMロール作成

①S3とコンテナへのアクセス権限を付与したIAMロールを作成

今回は、POD内のコンテナに対してS3コマンド実行が目的なので以下の二つのポリシーを追加

・AmazonEC2ContainerRegistryReadOnly
・AmazonS3FullAccess
 
②IAMロールの【信頼されたエンティティ】の設定

PODからS3コマンドが実行できるように設定

・信頼されたエンティティの例

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "【arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX】"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "【oidc.eks.AWS_REGION.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX】:sub": "system:serviceaccount:【SERVICE_ACCOUNT_NAMESPACE】:【SERVICE_ACCOUNT_NAME】",
          "【oidc.eks.AWS_REGION.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX】:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}

 
【"Federated"】: IDプロバイダのARN
【"StringEquals"】: プロバイダ名
【SERVICE_ACCOUNT_NAMESPACE】: Service Account を作成する Namespace名
【SERVICE_ACCOUNT_NAME】: この後に作成する Service Account名

 

3. Service Account 作成

先ほど作成したIAMロールを関連付けした Service Account を作成

IAMロールを定義したyamlを指定して Service Account 作成します

・yamlの例

apiVersion: v1
kind: ServiceAccount
metadata:
  name: 【ServiceAccount名】
  namespace: 【Namespace名】
  annotations:
    eks.amazonaws.com/role-arn: 【IAMロールのARN】

 

Service Account 作成コマンド

kubectl apply -f 【xxxxx.yaml】

 

指定した namespace に作成されているか確認コマンド

kubectl get sa -n 【Namespace名】

 

4. POD作成

S3コマンドを実行するPODを作成

namespace、serviceAccount を定義したyamlを指定して POD を作成します

・yamlの例

apiVersion: v1
kind: Pod
metadata:
  name: 【POD名】
  namespace: 【namespace名】
spec:
  serviceAccountName: 【serviceAccount名】
  containers:
  - name: 【PODに配置されるコンテナ名を指定】
    image: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/aws-cli/aws-cli:2.13.18
    command:
    - sh
    - -c
    - |

      LOG_FILE="/mnt/shared/container.log"

      # 無限ループを実行してコンテナが終了しないようにする
      while true; do
        # AWS CLIコマンドを実行
        aws s3 ls

        echo "Logging something..."  
        echo "Logging something..." >> "$LOG_FILE" 
        sleep 3600 
      done

    volumeMounts:
    - name: shared-data
      mountPath: /mnt/shared
    - name: config-map-volume
      mountPath: /etc/config
  volumes:
  - name: shared-data
    emptyDir: {}
  - name: config-map-volume
    configMap:
      name: test-configmap

10行目 : S3コマンドが使えるよう ECR Public から AWS CLI の Docker 公式イメージを取得して使用しています

※参考 Docker 公式イメージ

 
POD 作成コマンド

kubectl apply -f 【xxxxx.yaml】

 

5. PODからS3コマンド実行

①作成した POD を指定してシェルを実行

シェル実行コマンド

kubectl exec -it 【POD名】 -n 【namespace名】 -- /bin/sh

②POD内のコンテナに対してS3コマンドを実行

kubectl exec -it 【コンテナ名】 -n 【namespace名】 -- /bin/sh -c "aws s3 ls"

 

まとめ

今回は、Kubernetes の kubectl コマンドを使用して、EKS クラスター内の POD から S3コマンドを実行する方法について、ざっくりですが紹介しました。kubectlを活用することで、Kubernetesクラスター内のリソースを柔軟に制御し、AWS上でのコンテナ環境の運用を効率化することができます。
 

EKS は Kubernetes 用に開発されたツールを使用でき、ECS に比べて自由度が高くより高度な運用が可能なサービスだと思います。
一方で、EKS は Kubernetes を AWS 上で実行するサービスであるため、他のAWSサービスとの親和性は ECS の方が高いかもしれません。
 

今後は、EKS と ECS 両方のスキルが求められる時代になるかもしれません。

Last modified: 2024-02-14

Author