首页 > 解决方案 > 无法使用 CLI 更新 ElasticSearch 访问策略

问题描述

我有一个看起来像这样的访问策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:123456789012:domain/es01-vpc01-prod-useast1/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "123.456.123.456"
          ]
        }
      }
    }
  ]
}

据我了解,这应该将所有与es相关的权限授予 IP 123.456.123.456 上的任何人。这确实适用于大多数事情:我可以访问 ElasticSearch,还可以执行 CLI 命令,例如aws es describe-elasticsearch-domain --domain-name es01-vpc01-prod-useast1

但是,由于某种原因,我无法使用以下命令从 CLI 修改访问策略:

aws es update-elasticsearch-domain-config --domain-name es01-vpc01-prod-useast1 --access-policies '{\"Version\": \"2012-10-17\",\"Statement\": [{\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"*\"},\"Action\": \"es:*\",\"Resource\": \"arn:aws:es:us-east-1:123456789012:domain/es01-vpc01-prod-useast1/*\",\"Condition\": {\"IpAddress\": {\"aws:SourceIp\": [\"123.456.123.456\"]}}}]}'

我收到一个错误,例如:

调用 UpdateElasticsearchDomainConfig 操作时发生错误 (AccessDeniedException):用户:arn:aws:iam::123456789012:user/MyUser 无权执行:es:UpdateElasticsearchDomainConfig on resource:arn:aws:es:us-east-1: 123456789012:域/es01-vpc01-prod-useast1

我尝试了访问策略的变体,例如将特定角色添加到访问策略中,例如

{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:role/MyRole"
  },
  "Action": [
    "es:UpdateElasticsearchDomainConfig"
  ],
  "Resource": "arn:aws:es:us-east-1:123456789012:domain/es01-vpc01-prod-useast1"
}

但仍然没有成功。完成这项工作的诀窍是什么?

标签: elasticsearchaws-cli

解决方案


我知道这是一个老话题,但万一其他人也有同样的问题。

请注意,仅当 ES 域位于 VPC 之外时,ES 的 IP 地址白名单才有效。

以下命令对我有用,主要是如果您将 JSON 用单引号括起来,则不需要转义双引号。

将“我的域”、“1234567890”的帐户 ID 和“127.0.0.1”的 IP 地址更改为您自己的,它应该适合您。

aws es update-elasticsearch-domain-config --domain-name my-domain --access-policies '{
  "Version": "2012-10-17", 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:1234567890:domain/my-domain/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "127.0.0.1"
        }
      }
    }
  ]
}'

推荐阅读