お疲れ様です。
今回は、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-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 両方のスキルが求められる時代になるかもしれません。