无法从 EKS 容器写入 Kinesis

问题描述 投票:0回答:1

我正在账户 A 中的 EKS 上运行容器,并且需要写入另一个账户(账户 B)中的 Kinesis 流 (firehose)。

我使用的是 boto3,在本地运行时,我使用使用

aws configure
设置的用户 IAM 凭证。

但是当部署到 EKS 时,它无法写入该流,因为它找不到它。 我怀疑我需要以某种方式在账户 A 上设置 IAM 角色,并在账户 B 的 EKS 中使用它,但我就是找不到方法。

任何帮助都会很棒...

client = boto3.client('firehose')
client.put_record_batch(DeliveryStreamName=self.kinesis_stream_name, Records=records)
amazon-web-services kubernetes amazon-kinesis amazon-eks
1个回答
0
投票
  • 您需要在 aws 中的账户 A(Kinesis) 和 B(EKS) 之间启用跨账户权限。 创建 IAM 角色以访问 Kinesis。

  • 跨账户权限AWS

  • 因此,当您的容器主机(EC2 实例)从上面创建的跨账户 IAM 角色获取实例配置文件时。您的容器将能够访问账户 A(Kinesis)。 看这里

  • 转到

    IAM
    ->
    Roles
    ->
    ecsInstanceRole
    ---> 现在使用您新创建的策略更新此角色。
    ecsInstanceRole
    是为所有 EKS 容器实例(现货或按需)创建的默认角色 refer

  • 添加角色后,在逻辑中添加

    assume-role
    api 调用,以便容器将在另一个帐户中承担 Kinesis 的角色。

  • aws 文档中的 Boto 示例:

import boto3

# Create IAM client
sts_default_provider_chain = boto3.client('sts')

print('Default Provider Identity: : ' + sts_default_provider_chain.get_caller_identity()['Arn'])

role_to_assume_arn='arn:aws:iam::123456789012:role/roleName'
role_session_name='test_session'

response=sts_default_provider_chain.assume_role(
    RoleArn=role_to_assume_arn,
    RoleSessionName=role_session_name
)

creds=response['Credentials']

sts_assumed_role = boto3.client('sts',
    aws_access_key_id=creds['AccessKeyId'],
    aws_secret_access_key=creds['SecretAccessKey'],
    aws_session_token=creds['SessionToken'],
)

print('AssumedRole Identity: ' + sts_assumed_role.get_caller_identity()['Arn'])
  • 对于端到端示例 see ,只需相应地替换角色(在您的情况下
    ecsInstanceRole
    -> 将更新,而不是新角色)

PS:另外只是为了测试您可以在 boto3 api 调用中使用 AWS 账户 A 的实际编程访问 Access+Secret Keys。但完全不推荐。

© www.soinside.com 2019 - 2024. All rights reserved.