この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
お疲れ様です。
 
今回は、Kubernetesの" kubectlコマンド "を使用して、EKSクラスター内の POD から S3 コマンドを実行する方法について紹介していきます。
 
kubctlとは
Kubernetesが提供する、 kubernetes APIを使用してKubernetesクラスターのコントロールプレーンと通信するためのコマンドラインツールです。
kubectlコマンドラインツールを使うと、Kubernetesクラスターを制御できます。環境設定のために、kubectlは、$HOME/.kubeディレクトリにあるconfigという名前のファイルを探します。他のkubeconfigファイルは、KUBECONFIG環境変数を設定するか、–kubeconfigフラグを設定することで指定できます。
前提条件
踏み台サーバー(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-configmap10行目 : 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 両方のスキルが求められる時代になるかもしれません。



