运行CodePipeline

上一次由于CodeBuild的Role没有访问ECR的权限,所以流水线执行中间会出错,我们先来修复这些权限问题

补充CodeBuild的Policy

在AWS IAM Roles页面,搜索codebuild-golang-,并进入Role里面:

image-20220313145930464

添加policy:

image-20220313145956169

搜索registry,添加FullAccess policy(在生产环境中,要用更细粒度的权限),并点击确认。

image-20220313150032302

这样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集群进行交互:

image-20220313151308334

使用JSON格式编辑,将account id根据实际情况做替换,内容如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": "arn:aws:iam::145197526627:role/EksWorkshopCodeBuildKubectlRole",
            "Effect": "Allow"
        }
    ]
}

Review步骤,为其命名为eks-read, 并创建policy

image-20220313151650800

重新执行Build

回到构建失败的CodePipeline页面,点击Retry:

image-20220313150048797

经过几分钟后会构建成功。点击Details,可以查看构建过程中CodeBuild输出的日志:

image-20220313175925055

image-20220313180008759

访问应用

我们的应用已经部署到EKS, 可以通过kubectl get svc,deploy命令进行确认。

访问svc创建的ELB地址:

image-20220313180127456

效果如下:

image-20220313180206123