适用于AWS CodeBuild容器输出的Terraform访问被拒绝

问题描述

背景

我正在使用一个AWS资源集合的数据管道(例如AWS胶水,雅典娜,s3等)。我正在使用terraform在AWS CodeBuild中部署AWS资源。所有terraform配置文件都存储在GitHub存储库中。 CodeBuild项目使用GitHub存储库作为源。

问题:

触发CodeBuild项目时,terraform apply命令用于将.tf文件配置应用于AWS资源。 terraform apply命令输出错误

error output

CodeBuild项目角色具有以下策略:

{
    "Version": "2012-10-17","Statement": [
        {
            "Effect": "Allow","Resource": [
                "arn:aws:logs:us-west-2:xxxxxxxxxxxx:log-group:/aws/codebuild/sparkify-CI","arn:aws:logs:us-west-2:xxxxxxxxxxxx:log-group:/aws/codebuild/sparkify-CI:*"
            ],"Action": [
                "logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"
            ]
        },{
            "Effect": "Allow","Resource": [
                "arn:aws:s3:::sparkify-dend-analytics"
            ],"Action": [
                "s3:PutObject","s3:Getobject","s3:GetobjectVersion","s3:GetBucketAcl","s3:GetBucketLocation"
            ]
        },"Action": [
                "codebuild:CreateReportGroup","codebuild:CreateReport","codebuild:UpdateReport","codebuild:BatchPutTestCases","codebuild:BatchPutCodeCoverages"
            ],"Resource": [
                "arn:aws:codebuild:us-west-2:xxxxxxxxxxxx:report-group/sparkify-CI-*"
            ]
        },"Resource": [
                "arn:aws:ec2:us-west-2:xxxxxxxxxxxx:vpc/vpc-xxxxxxxxxxxxxxxxxxx"
            ],"Action": [
                "ec2:AcceptVpcPeeringConnection","ec2:AcceptVpcEndpointConnections","ec2:AllocateAddress","ec2:AssignIpv6Addresses","ec2:AssignPrivateIpAddresses","ec2:AssociateAddress","ec2:AssociateDhcpOptions","ec2:AssociateRouteTable","ec2:AssociatesubnetCidrBlock","ec2:AssociateVpcCidrBlock","ec2:AttachClassicLinkVpc","ec2:AttachInternetGateway","ec2:AttachNetworkInterface","ec2:AttachVpnGateway","ec2:AuthorizeSecurityGroupEgress","ec2:AuthorizeSecurityGroupIngress","ec2:CreateCustomerGateway","ec2:CreateDefaultsubnet","ec2:CreateDefaultVpc","ec2:CreateDhcpOptions","ec2:CreateEgressOnlyInternetGateway","ec2:CreateFlowLogs","ec2:CreateInternetGateway","ec2:CreateNatGateway","ec2:CreateNetworkAcl","ec2:CreateNetworkAclEntry","ec2:CreateNetworkInterface","ec2:CreateNetworkInterfacePermission","ec2:CreateRoute","ec2:CreateRouteTable","ec2:CreateSecurityGroup","ec2:Createsubnet","ec2:CreateTags","ec2:CreateVpc","ec2:CreateVpcEndpoint","ec2:CreateVpcEndpointConnectionNotification","ec2:CreateVpcEndpointServiceConfiguration","ec2:CreateVpcPeeringConnection","ec2:CreateVpnConnection","ec2:CreateVpnConnectionRoute","ec2:CreateVpnGateway","ec2:DeleteCustomerGateway","ec2:DeleteDhcpOptions","ec2:DeleteEgressOnlyInternetGateway","ec2:DeleteFlowLogs","ec2:DeleteInternetGateway","ec2:DeleteNatGateway","ec2:DeleteNetworkAcl","ec2:DeleteNetworkAclEntry","ec2:DeleteNetworkInterface","ec2:DeleteNetworkInterfacePermission","ec2:DeleteRoute","ec2:DeleteRouteTable","ec2:DeleteSecurityGroup","ec2:Deletesubnet","ec2:DeleteTags","ec2:DeleteVpc","ec2:DeleteVpcEndpoints","ec2:DeleteVpcEndpointConnectionNotifications","ec2:DeleteVpcEndpointServiceConfigurations","ec2:DeleteVpcPeeringConnection","ec2:DeleteVpnConnection","ec2:DeleteVpnConnectionRoute","ec2:DeleteVpnGateway","ec2:DescribeAccountAttributes","ec2:DescribeAddresses","ec2:DescribeAvailabilityZones","ec2:DescribeClassicLinkInstances","ec2:DescribeCustomerGateways","ec2:DescribedhcpOptions","ec2:DescribeEgressOnlyInternetGateways","ec2:DescribeFlowLogs","ec2:DescribeInstances","ec2:DescribeInternetGateways","ec2:DescribeKeyPairs","ec2:DescribeMovingAddresses","ec2:DescribeNatGateways","ec2:DescribeNetworkAcls","ec2:DescribeNetworkInterfaceAttribute","ec2:DescribeNetworkInterfacePermissions","ec2:DescribeNetworkInterfaces","ec2:DescribePrefixLists","ec2:DescribeRouteTables","ec2:DescribeSecurityGroupReferences","ec2:DescribeSecurityGroups","ec2:DescribeStaleSecurityGroups","ec2:Describesubnets","ec2:DescribeTags","ec2:DescribeVpcAttribute","ec2:DescribeVpcclassicLink","ec2:DescribeVpcclassicLinkDnsSupport","ec2:DescribeVpcEndpointConnectionNotifications","ec2:DescribeVpcEndpointConnections","ec2:DescribeVpcEndpoints","ec2:DescribeVpcEndpointServiceConfigurations","ec2:DescribeVpcEndpointServicePermissions","ec2:DescribeVpcEndpointServices","ec2:DescribeVpcPeeringConnections","ec2:DescribeVpcs","ec2:DescribeVpnConnections","ec2:DescribeVpnGateways","ec2:DetachClassicLinkVpc","ec2:DetachInternetGateway","ec2:DetachNetworkInterface","ec2:DetachVpnGateway","ec2:disableVgwRoutePropagation","ec2:disableVpcclassicLink","ec2:disableVpcclassicLinkDnsSupport","ec2:disassociateAddress","ec2:disassociateRouteTable","ec2:disassociatesubnetCidrBlock","ec2:disassociateVpcCidrBlock","ec2:EnableVgwRoutePropagation","ec2:EnableVpcclassicLink","ec2:EnableVpcclassicLinkDnsSupport","ec2:ModifyNetworkInterfaceAttribute","ec2:ModifysubnetAttribute","ec2:ModifyVpcAttribute","ec2:ModifyVpcEndpoint","ec2:ModifyVpcEndpointConnectionNotification","ec2:ModifyVpcEndpointServiceConfiguration","ec2:ModifyVpcEndpointServicePermissions","ec2:ModifyVpcPeeringConnectionoptions","ec2:ModifyVpcTenancy","ec2:MoveAddresstoVpc","ec2:RejectVpcEndpointConnections","ec2:RejectVpcPeeringConnection","ec2:ReleaseAddress","ec2:ReplaceNetworkAclAssociation","ec2:ReplaceNetworkAclEntry","ec2:ReplaceRoute","ec2:ReplaceRouteTableAssociation","ec2:ResetNetworkInterfaceAttribute","ec2:RestoreAddresstoClassic","ec2:RevokeSecurityGroupEgress","ec2:RevokeSecurityGroupIngress","ec2:UnassignIpv6Addresses","ec2:UnassignPrivateIpAddresses","ec2:UpdateSecurityGroupRuleDescriptionsEgress","ec2:UpdateSecurityGroupRuleDescriptionsIngress"
            ]
        }
    ]
}

CodeBuild项目配置:

图片:aws / codebuild / amazonlinux2-x86_64-standard:2.0

环境类型:Linux

计算:3 GB内存,2个vcpu

特权:错误

环境变量:

terraform_VERSION = 0.12.28

buildspec.yml:

version: 0.2

phases:

  install:
    commands:
      - wget https://releases.hashicorp.com/terraform/"$terraform_VERSION"/terraform_"$terraform_VERSION"_linux_amd64.zip
      - unzip terraform_"$terraform_VERSION"_linux_amd64.zip
      - rm terraform_"$terraform_VERSION"_linux_amd64.zip
      - mv terraform /usr/local/bin/
  build:
    commands:
      - echo $CODEBUILD_WEBHOOK_TRIGGER
      - BRANCH_NAME=$(echo $CODEBUILD_WEBHOOK_HEAD_REF | cut -d'/' -f 3)
      - | 
        case $BRANCH_NAME in
          dev|prod) TF_COMMAND="apply -auto-approve";; \
          *) TF_COMMAND="plan";;
        esac
      - echo $BRANCH_NAME
      - export AWS_ACCESS_KEY_ID=`curl --silent http://169.254.170.2:80$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq -r '.AccessKeyId'`
      - export AWS_SECRET_ACCESS_KEY=`curl --silent http://169.254.170.2:80$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq -r '.SecretAccessKey'`
      - export AWS_DEFAULT_REGION="us-west-2"
      - |
        for service in deployment/*/; do
          if [ -d "${service}/${BRANCH_NAME}/" ]; then
            #get list of non-hidden directories within ${service}/${BRANCH_NAME}/
            service_dir_list=$(find "${service}${BRANCH_NAME}" -type d | grep -v '/\.')
            for dir in $service_dir_list; do
              #if directory contains .tf or .tfvars files
              if (ls ${dir}/*.tf) > /dev/null 2>&1 || (ls ${dir}/*.tfvars) > /dev/null 2>&1; then
                cd $dir > /dev/null
                echo ""
                echo "*************** terraform INIT ******************"
                echo "******* At directory: ${dir} ********"
                echo "*************************************************"
                terraform init
                echo ""
                echo "*************** terraform $TF_COMMAND ******************"
                echo "******* At directory: ${dir} ********"
                echo "*************************************************"
                terraform $TF_COMMAND
                cd - > /dev/null 
              else
                :
                # echo "No terraform file were found in ${dir}"
              fi
            done 
          else
            echo "No ${BRANCH_NAME} environment directory exists within ${dir}"

          fi

        done
    

尝试:

1。

在AWS提供程序块中使用Codebuild容器的访问权限和密钥。

如何在buildspec.yml中获取容器的凭据:

- export AWS_ACCESS_KEY_ID=`curl --silent http://169.254.170.2:80$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq -r '.AccessKeyId'`
- export AWS_SECRET_ACCESS_KEY=`curl --silent http://169.254.170.2:80$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq -r '.SecretAccessKey'`

但是在CodeBuild中运行terraform apply会导致错误

error using credentials to get account ID: error calling sts:GetCallerIdentity: InvalidClientTokenId: 
The security token included in the request is invalid. status code: 403,request id: x

AmazonVPCFullAccess添加到CodeBuild IAM角色。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...