上一次由于CodeBuild的Role没有访问ECR的权限,所以流水线执行中间会出错,我们先来修复这些权限问题
在AWS IAM Roles页面,搜索codebuild-golang-
,并进入Role里面:
添加policy:
搜索registry
,添加FullAccess
policy(在生产环境中,要用更细粒度的权限),并点击确认。
这样CodeBuild的Role就有了访问ECR的权限。但它还缺少AssumeRole的权限, 因为它要执行aws sts assume-role
命令:
post_build:
commands:
- docker push $REPOSITORY_URI:$TAG
- CREDENTIALS=$(aws sts assume-role --role-arn $EKS_KUBECTL_ROLE_ARN --role-session-name codebuild-kubectl --duration-seconds 900)
- export AWS_ACCESS_KEY_ID="$(echo ${CREDENTIALS} | jq -r '.Credentials.AccessKeyId')"
- export AWS_SECRET_ACCESS_KEY="$(echo ${CREDENTIALS} | jq -r '.Credentials.SecretAccessKey')"
- export AWS_SESSION_TOKEN="$(echo ${CREDENTIALS} | jq -r '.Credentials.SessionToken')"
- export AWS_EXPIRATION=$(echo ${CREDENTIALS} | jq -r '.Credentials.Expiration')
所以我们再为它添加一条inline Policy,赋予AssumeRole权限,这样CodeBuild所在机器就能使用kubectl与EKS集群进行交互:
使用JSON格式编辑,将account id根据实际情况做替换,内容如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sts:AssumeRole"
],
"Resource": "arn:aws:iam::145197526627:role/EksWorkshopCodeBuildKubectlRole",
"Effect": "Allow"
}
]
}
Review步骤,为其命名为eks-read
, 并创建policy
回到构建失败的CodePipeline页面,点击Retry:
经过几分钟后会构建成功。点击Details,可以查看构建过程中CodeBuild输出的日志:
我们的应用已经部署到EKS, 可以通过kubectl get svc,deploy
命令进行确认。
访问svc创建的ELB地址:
效果如下: