はじめに
Releaseタグ作成からEKSへのデプロイを自動化した話 でやった内容のうち、 Code build に焦点を当てた内容です。
載せているコードは一部だけなので、全体を見たい方は上記の記事から辿ってください。
環境
-
Kubernetes:1.24 -
AWS CDK for Golang:v2.56.1
やったこと
MasterRole を作成
AWS CDK で Cluster を作成した後に、 MasterRole を参照することができなかったので、 Cluster を作成する時に明示的に MasterRole を設定しました。
eksMasterRole := awsiam.NewRole(scope, jsii.String("id-eks-master-role"), &awsiam.RoleProps{
AssumedBy: awsiam.NewAccountRootPrincipal(),
})
subnets := []*awsec2.SubnetSelection{
{
SubnetType: awsec2.SubnetType_PRIVATE_WITH_EGRESS,
},
}
props := awseks.FargateClusterProps{
Version: awseks.KubernetesVersion_Of(jsii.String(config.Cluster.K8SVersion)),
KubectlLayer: kubectl.NewKubectlLayer(scope, jsii.String("id-kubectl-layer")),
ClusterName: jsii.String(config.Cluster.Name),
MastersRole: eksMasterRole,
Vpc: vpc,
VpcSubnets: &subnets,
AlbController: &awseks.AlbControllerOptions{
Version: awseks.AlbControllerVersion_V2_4_1(),
},
}
cluster := awseks.NewFargateCluster(scope, jsii.String("eks-cluster-id"), &props)
Code build の環境変数に Role の ARN を設定
Code build の中で kubectl を実行する時に --role-arn を指定する必要があるので、それで使うために環境変数に設定しました。
buildAction := actions.NewCodeBuildAction(
&actions.CodeBuildActionProps{
ActionName: jsii.String("build"),
Input: sourceOutput,
Project: buildProject,
EnvironmentVariables: &map[string]*build.BuildEnvironmentVariable{
"IMAGE_REPO_NAME": {
Value: jsii.String(config.Repository.Name),
Type: build.BuildEnvironmentVariableType_PLAINTEXT,
},
"WEB_HOOK_URL": {
Value: jsii.String(config.Slack.WebHookURL),
Type: build.BuildEnvironmentVariableType_PLAINTEXT,
},
"AWS_ACCOUNT_ID": {
Value: config.GetAwsAccountID(),
Type: build.BuildEnvironmentVariableType_PLAINTEXT,
},
"EKS_CLUSTER_NAME": {
Value: jsii.String(config.Cluster.Name),
Type: build.BuildEnvironmentVariableType_PLAINTEXT,
},
"EKS_CLUSTER_ROLE": {
Value: eksMasterRole.RoleArn(),
Type: build.BuildEnvironmentVariableType_PLAINTEXT,
},
"DOCKER_USER": {
Value: dockerUser.ParameterName(),
Type: build.BuildEnvironmentVariableType_PARAMETER_STORE,
},
"DOCKER_TOKEN": {
Value: dockerToken.ParameterName(),
Type: build.BuildEnvironmentVariableType_PARAMETER_STORE,
},
},
},
)
Code build の Role に必要な権限を追加
kubectl コマンドを実行するために、 eks:DescribeCluster と sts:AssumeRole がそれぞれ必要だったので追加しました。
buildRole.AddToPolicy(awsiam.NewPolicyStatement(&awsiam.PolicyStatementProps{
Actions: jsii.Strings("eks:DescribeCluster"),
Effect: awsiam.Effect_ALLOW,
Resources: jsii.Strings(*cluster.ClusterArn()),
}))
buildRole.AddToPolicy(awsiam.NewPolicyStatement(&awsiam.PolicyStatementProps{
Actions: jsii.Strings("sts:AssumeRole"),
Effect: awsiam.Effect_ALLOW,
Resources: jsii.Strings(*eksMasterRole.RoleArn()),
}))
buildspec.yml に aws eks update-kubeconfig を追加
ローカルで実行するときと同様に kubectl でアクセスするために aws eks update-kubeconfig を実行する必要があるので、このコマンドを追加しました。
また、ロールを指定する必要があるので --role-arn オプションを追加しています。
- aws eks update-kubeconfig --name ${EKS_CLUSTER_NAME} --region ${AWS_DEFAULT_REGION} --role-arn ${EKS_CLUSTER_ROLE}
最後に
今回色々試してみて最終的に上記の通りやることで、動くようになりました。
もし「この方法がより良いやり方だよ」ってのがありましたらコメント頂けると幸いです。