K8S 上的雪犁收集器不使用服务帐户

问题描述

似乎我们无法让 SNowplow 容器(sNowplow/scala-stream-collector-kinesis)使用我们提供的服务帐户。它始终使用 shared-eks-node-role 而不是提供的服务帐户。对于 defaultaccessKey,配置都设置为 secretKey

这是我们使用的服务帐户部分:

apiVersion: v1
kind: ServiceAccount
Metadata:
  name: thijs-service-account
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123:role/thijs-eks-service-account-role-sNowplow

当我检查 pod 时,我可以看到帐户:

AWS_ROLE_ARN:                 arn:aws:iam::123:role/thijs-eks-service-account-role-sNowplow

然后错误显示帐户不正确。

Exception in thread "main" com.amazonaws.services.kinesis.model.AmazonKinesisException: User: arn:aws:sts::123:assumed-role/shared-eks-node-role/i-123 is not authorized to perform: kinesis:DescribeStream on resource: arn:aws:kinesis:eu-west-1:123:stream/sNowplow-good (Service: AmazonKinesis; Status Code: 400; Error Code: AccessDeniedException; Request ID: 123-123-123; Proxy: null)

解决方法

收集器本身不进行任何角色交换。它只关心通过以下三种方法之一接收凭据:

  • 默认信用提供者链
  • 特定的 IAM 角色
  • 环境变量。

最流行的部署是在 EC2 实例上,在这种情况下,默认 EC2 角色可用于访问帐户中的其他资源。

看起来当您在 EKS 上部署它时,事情并不那么简单。收集器似乎与这个假定角色一起工作:arn:aws:sts::123:assumed-role/shared-eks-node-role/i-123 但它没有获得 Kinesis 权限的授权。您知道是什么流程创建了该角色吗?也许您可以在那里添加缺少的 Kinesis 政策?

,

我也有同样的问题。

它不能使用 env 作为值,因为这些值未设置。但是,收集器作为容器运行 - 它应该使用默认凭据链。

从注释来看,似乎没有设置 env 变量,我应该使用 iam - 当我这样做时,它使用 IAM 实例配置文件,它加载底层节点角色- 不是 SA 指定的角色。

SDK 支持 IRSA(我已将雪犁收集器容器映像更新为 1,根据 supported versions 支持大于 1.11.704 的 SDK),并且从我从收集器文档中可以看到,流配置需要一个带有 awsenv 作为值的 iam 块...但我想使用默认凭据链而不指定方法....

如果我连接到容器,我可以看到凭据是按照 SA 设置的:

$ env | grep -i aws
AWS_REGION=my-region
AWS_DEFAULT_REGION=my-region
AWS_ROLE_ARN=arn:aws:iam::<redacted>:role/sp-collector-role
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token

但是当我运行收集器时,它仍然使用节点 IAM 实例配置文件,我在 sp-collector-role 下看不到任何活动。有没有办法使用默认的凭证链?例如在同一服务帐户中的容器上使用 aws CLI,我没有指定任何凭据,但是当我运行 aws sts get-caller-identity 时,SDK 正确解析 IRSA 角色。