Amazon web services 使用Terraform的实例配置文件在EC2上运行

Amazon web services 使用Terraform的实例配置文件在EC2上运行,amazon-web-services,terraform,Amazon Web Services,Terraform,我正在尝试在AWS EC2实例上运行Terraform,该实例是使用实例概要文件设置的。然而,Terraform似乎没有隐式地使用实例概要文件,因此,每当它试图访问我的S3远程状态时,我都会收到一个“拒绝访问”错误 从文档中,我很难判断是否需要指定AWS_METADATA_URL,或者是否明确要求我做任何其他事情来实现这一点 根据Terraform文档: EC2角色,如果您正在使用IAM从EC2实例运行Terraform 使用IAM角色的实例概要文件,Terraform将只询问元数据 凭据的AP

我正在尝试在AWS EC2实例上运行Terraform,该实例是使用实例概要文件设置的。然而,Terraform似乎没有隐式地使用实例概要文件,因此,每当它试图访问我的S3远程状态时,我都会收到一个“拒绝访问”错误

从文档中,我很难判断是否需要指定AWS_METADATA_URL,或者是否明确要求我做任何其他事情来实现这一点

根据Terraform文档:

EC2角色,如果您正在使用IAM从EC2实例运行Terraform 使用IAM角色的实例概要文件,Terraform将只询问元数据 凭据的API端点

当您需要在EC2中运行时,这是一种优于其他任何方法的首选方法 可以避免硬编码凭证。相反,它们是动态租赁的 通过地形,减少泄漏的机会

您可以通过提供自定义元数据API端点 AWS_METADATA_URL变量,该变量需要端点URL,包括 版本,默认为

下面是我尝试运行的示例:

# main.tf

provider "aws" {
  region = "${var.region}"
}

terraform {
  backend "s3" {}
}

module "core" {
  // ....
}


# init .sh

terraform init -force-copy -input=false \
        -backend-config="bucket=$TERRAFORM_STATE_BUCKET" \
        -backend-config="key=$ENVIRONMENT/$SERVICE" \
        -backend-config="region=$REGION" \
        -upgrade=true

# AWS policy
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "*"
            ]
        },
    ]
}
更新 s3列表对象命令在Terraform中似乎失败了,尽管我的策略应该允许这样做

-----------------------------------------------------
2018/02/20 21:09:37 [DEBUG] [aws-sdk-go] DEBUG: Response s3/ListObjects Details:
---[ RESPONSE ]--------------------------------------
HTTP/1.1 403 Forbidden
Connection: close
Transfer-Encoding: chunked
Content-Type: application/xml
Date: Tue, 20 Feb 2018 21:09:36 GMT
Server: AmazonS3
X-Amz-Id-2: OVK5E3d5R+Jgj3if5lxAXkwuERPZWsJNFJ7NeMYFbSrhQ/h4FfpV4z2mlgXFKT1Hg7lsqJ/jE6Q=
X-Amz-Request-Id: FE6B77C5C74BCFFF


-----------------------------------------------------
2018/02/20 21:09:37 [DEBUG] [aws-sdk-go] <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>FE6B77C5C74BCFFF</RequestId><HostId>OVK5E3d5R+Jgj3if5lxAXkwuERPZWsJNFJ7NeMYFbSrhQ/h4FfpV4z2mlgXFKT1Hg7lsqJ/jE6Q=</HostId></Error>
2018/02/20 21:09:37 [DEBUG] [aws-sdk-go] DEBUG: Validate Response s3/ListObjects failed, not retrying, error AccessDenied: Access Denied
    status code: 403, request id: FE6B77C5C74BCFFF, host id: OVK5E3d5R+Jgj3if5lxAXkwuERPZWsJNFJ7NeMYFbSrhQ/h4FfpV4z2mlgXFKT1Hg7lsqJ/jE6Q=
2018/02/20 21:09:37 [DEBUG] plugin: waiting for all plugin processes to complete...
[31mError inspecting state in "s3": AccessDenied: Access Denied
    status code: 403, request id: FE6B77C5C74BCFFF, host id: OVK5E3d5R+Jgj3if5lxAXkwuERPZWsJNFJ7NeMYFbSrhQ/h4FfpV4z2mlgXFKT1Hg7lsqJ/jE6Q=

您需要一个具有s3访问权限的IAM策略附加到您的实例配置文件。@SudharsanSivasankaran是的,我已经有了这个设置。您可以发布该策略吗?您不需要明确提到元数据。你能试着运行“aws s3 ls”吗?只是想看看您的实例配置文件是否设置正确。@SudharsanSivasankaran是的,如果我运行
aws s3 ls
,它会成功打印我的s3存储桶列表。我附上上面的保险单。mysetup唯一不寻常的地方是:我的个人资料中有两个附加到我的角色的策略。我使用的是
kops
,它用非常具体的
allow
语句设置了一个策略。然后,我附加了第二个具有全开
s3
权限的策略。您能分享您得到的错误吗?理想情况下,在设置
TF_LOG=DEBUG
时也会调用相关的API。