Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Amazon EKS 用のカスタム Amazon Linux AMI を作成するにはどうすればよいですか?
Amazon Elastic Kubernetes Service (Amazon EKS) クラスターでデプロイするカスタム Amazon Linux Amazon マシンイメージ (AMI) を作成したいと考えています。
解決策
前提条件
- ローカルマシンまたは Amazon Linux の Amazon Elastic Compute Cloud (EC2) インスタンスに Packer をインストールしておきます。手順については、Hashicorp ウェブサイトの「Install Packer」を参照してください。
- 次に、AWS でカスタムイメージを作成するために Hashicorp Packer で使用する Amazon プラグインをインストールします。手順については、Hashicorp ウェブサイトの「Installation」を参照してください。
- make と git がインストールされていることを確認します。
sudo yum install make -y sudo yum install git -y
Amazon EKS 用のカスタム Amazon Linux AMI を作成する
次の手順を実行します。
-
amazon-eks-ami AWS ラボリポジトリのクローンを作成するには、次のコマンドを実行します。
sudo git clone https://github.com/awslabs/amazon-eks-ami && cd amazon-eks-ami
詳細については、GitHub ウェブサイトの amazon-ecs-init を参照してください。
-
variables-custom.json という名前の新しいファイルを amazon-eks-ami ディレクトリ内に作成するには、次のコマンドを実行します。
sudo vi variables-custom.json
注: variables-custom.json で上書きされるデフォルトの変数ファイルは、GitHub ウェブサイトの variables-default.json ファイルに記載されています。Amazon Linux 2 (AL2) を使用している場合、variables-default.json のファイルパスは /amazon-eks-ami/templates/al2/variables-default.json になります。Amazon Linux 2023 (AL2023) を使用している場合、ファイルパスは /amazon-eks-ami/templates/al2023/variables-default.json になります。
-
variables-custom.json ファイルに、次の値を追加します。
{ "aws_region": "AWS_Region", "source_ami_filter_name": "AMI_Name", "source_ami_id": "Source_AMI_ID", "source_ami_owners": "AMI_Owner_Account_ID", "temporary_security_group_source_cidrs": "Source_Machine_IP", #example: local_machine_IP /32 or NAT_GW_IP /32 or EC2_PublicIP /32 "launch_block_device_mappings_volume_size": "Integer", #Root volume size of the instance to be launched by packer "iam_instance_profile": "IAM_Instance_Profile_Name" #Optional }
既存の AMI をソースとして使用して EKS 用にカスタマイズされた AMI を作成する場合は、launch_block_device_mappings_volume_size の値を設定します。この値は AMI スナップショットボリュームサイズ以上である必要があります。variables-default.json ファイルにあるこの値のデフォルトは「4」です。
Packer で iam_instance_profile オプションを使用する場合は、アタッチする IAM ロールのインスタンスプロファイル名を指定する必要があります。IAM ロールの ARN またはインスタンスプロファイルの ARN は指定しないでください。
temporary_security_group_source_cidrs パラメータを指定しない場合、Packer は SSH ポートをすべての IP アドレス (0.0.0.0/0) に開放します。セキュリティリスクを防ぐには、ソースマシンの IP アドレスを temporary_security_group_source_cidrs パラメータとして指定するのがベストプラクティスです。 -
カスタム AMI 作成プロセスを開始するには、次のコマンドを実行します。
sudo make PACKER_OPTIONAL_K8S_VARIABLE_FILE=variables-custom.json k8s=1.29 os_distro=al2 arch=x86_64 -d
または、Packer のログ記録を有効にするには、次のコマンドを実行します。
sudo PACKER_LOG_PATH=packer_logs.txt`TZ=":Asia/Kolkata" date +%Y-%m-%d_%H%M` PACKER_LOG=1 make PACKER_OPTIONAL_K8S_VARIABLE_FILE=variables-custom.json k8s=1.29 os_distro=al2 arch=x86_64 -d
注: システムのタイムゾーンを設定するには、「:Asia/Kolkata」を自分のタイムゾーンに置き換えてください。Packer ログファイルは、Packer コマンドを実行したのと同じディレクトリに生成されます。
-
make コマンドの実行に使用する IAM ユーザー認証情報または IAM ロールに、必要な IAM アクセス許可が付与されていることを確認します。詳細については、Hashicorp ウェブサイトの「IAM Task or Instance Role」および「Attaching IAM policies to roles」を参照してください。また、アクセス許可は、デフォルトの Amazon Simple Storage Service (Amazon S3) バケットへのアクセスを許可するものである必要があります。AmazonS3ReadOnlyAccess ポリシーを付与する必要があります。S3 バケットにアクセスできるアクセス許可がない場合は、次のエラーが表示されることがあります。
「required variable not set: kubernetes_build_date
required variable not set: kubernetes_version」注: これらのアクセス許可により、Packer は AWS に API コールを行うことができます。または、シークレットキーやシークレットアクセスキー、環境変数、共有認証情報ファイルなどの静的認証情報を設定することもできます。
-
カスタム AMI がソース AMI の AWS リージョンに存在することを確認してください。
Packer でインスタンスをプロビジョニングすると、デフォルトのバイナリが us-west-2 の Amazon EKS パブリック S3 バケット amazon-eks からダウンロードされます。詳細については、GitHub ウェブサイトの install-worker.sh ファイルを参照してください。
独自の Kubernetes バイナリを提供する (オプション)
次の手順を実行します。
- デフォルトのバケットで提供されている使用可能なバイナリを確認するには、次の AWS CLI コマンドを実行します。
注: amazon-eks、kubernetes_version、kubernetes_build_date、arch はそれぞれ実際の値で置き換えてください。aws s3 ls s3://amazon-eks aws s3 ls s3://amazon-eks/kubernetes_version/kubernetes_build_date/bin/linux/arch/
- プロビジョニング時に独自のバイナリをワーカーノードにダウンロードするには、install-worker.sh スクリプトで使用されている amazon-eks バケットフォルダ構造をミラーリングします。
- バイナリが準備できたら、AWS CLI を使用してバイナリを Amazon S3 バケットにコピーします。次の例では、カスタムバイナリである kubelet を使用しています。
注: my-custom-bucket、amazon-eks、kubernetes_version、kubernetes_build_date、arch はそれぞれ実際の値で置き換えてください。デフォルトの amazon-eks バケットにリストされているすべてのバイナリを指定する必要があります。aws s3 cp kubelet s3://my-custom-bucket/kubernetes_version/kubernetes_build_date/bin/linux/arch/kubelet
- ビルドプロセスを開始するには、/amazon-eks-ami/templates/al2/variables-default.json というパスにおいて、ディレクトリ al2 の下にある variables-default.json に設定されているソース AMI を使用します。make をパラメータ付きで呼び出すには、次のようなコマンドを実行します。
注: binary_bucket_name、binary_bucket_region、kubernetes_version、kubernetes_build_date パラメータが Amazon S3 のバイナリへのパスと一致することを確認します。make k8s binary_bucket_name=Custom_Bucket_Name binary_bucket_region=Region kubernetes_version=Version kubernetes_build_date=Build_Date -d
