【发布时间】:2018-01-11 19:20:30
【问题描述】:
我在 Elixir 中使用 ex_aws 库来尝试删除一个 S3 存储桶中的对象,但是,我收到 403,拒绝访问 生产中的响应,我不知道为什么会发生这种情况。 作为一个相关问题,使用不同的存储桶和环境,我收到 204 响应,但对象并未实际上被删除。
存储桶的策略对象具有必要的权限,例如:
{
"Sid": "BucketACL",
"Effect": "Allow",
"Principal": {
"AWS": "${my-apps-arn}"
},
"Action": "*",
"Resource": "${my-buckets-arn}/*"
}
我什至尝试添加一个额外的存储桶 ACL 语句,该语句明确
添加s3:DeleteObject 操作,并允许它。
存储桶没有版本控制,所以我不认为这意味着我需要添加
拨打DeleteObjectVersion或类似电话。
非常感谢任何帮助或建议让我朝着正确的方向前进。
编辑:
还值得一提的是,my-apps-arn 是应用程序的单独 IAM 用户,其内联策略类似于:
{
"Statement": [
{
"Action": [
"s3:*"
],
"Resource": [
"${my-bucket-arn}",
"${my-bucket-arn}/*"
],
"Effect": "Allow"
}
]
}
** 编辑 2 **
更多信息,以下代码是我如何制作 请求:
:app_name
|> Application.get_env(:aws_bucket_name)
|> S3.delete_object(path)
|> ExAws.request()
其中path设置为要删除的对象。
相关EX_AWS配置变量设置如下:
config :ex_aws,
access_key_id: ["${aws_key_id}"],
secret_access_key: ["${aws_secret_key}"],
s3: [
host: "${s3-bucket-url}",
region: "${region}"
]
此外,作为带外建议,我已尝试删除 通过 AWS CLI 工具使用相同凭证的对象,并且位于 事实上能够删除对象。所以这可能是一个客户问题之后 全部。
【问题讨论】:
-
可能有很多东西。当您说主体是您的应用程序时,您的意思是什么?那是 IAM 角色还是 IAM 用户?还是您的 AWS 账户 ARN?如果它是 IAM 角色,我怀疑该角色未附加到您的实例。
-
@user602525:
my-apps-arn是应用程序的独立 IAM 用户。 Elixir 应用程序被赋予了一个访问密钥和秘密,因此,据我所知,它不应该是/a 角色未附加到实例的问题。用户还会获得一个内联策略,允许其访问存储桶。 -
你能用 curl 删除吗?
-
你试过用
System.get_env/1访问操作系统变量吗? -
@PatNowak:我不确定从
System.get_env/1访问变量会如何改变任何事情。需要明确的是,上面的符号只是一种非正式的方式来表示我正在替换 actual 值以实现安全性并匿名源,代码非常直接地使用这些值。
标签: amazon-s3 permissions elixir amazon-iam