我正在账户 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)
您需要在 aws 中的账户 A(Kinesis) 和 B(EKS) 之间启用跨账户权限。 创建 IAM 角色以访问 Kinesis。
因此,当您的容器主机(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'])
ecsInstanceRole
-> 将更新,而不是新角色)PS:另外只是为了测试您可以在 boto3 api 调用中使用 AWS 账户 A 的实际编程访问 Access+Secret Keys。但完全不推荐。