从一个AWS子账户流S3文件,Flink部署在另一个AWS账户的Kubernetes集群上

时间:2019-10-22 10:19:04

标签: amazon-s3 kubernetes apache-flink amazon-iam flink-streaming

  1. 我有2个AWS账户Account AAccount B
  2. Account A具有运行的EKS集群和运行的flink集群。要管理IAM角色,我们使用Kube2iam
  3. 集群上的所有Pod具有分配给它们的特定角色。为简单起见,假设其中一个广告连播的角色是Pod-Role
  4. K8s工作节点具有Worker-Node-role角色
  5. 已正确配置Kube2iam以在需要时进行正确的EC2元数据调用。
  6. Account B有一个S3存储桶,在Pod工作节点中托管的Account A需要读取。

可能的解决方案:

  1. Account B中创建一个角色,比方说,AccountB_Bucket_access_role的策略允许读取存储桶。将Pod-Role添加为可信实体。
  2. Pod-role中添加一个策略,该策略允许切换到AccountB_Bucket_access_role,基本上是STS AssumeRole操作。
  3. 在Pod中创建custom_profile,将role_arn设置为AccountB_Bucket_access_role角色的信息。
  4. 在部署flink pod时,请设置AWS_PROFILE=AccountB_Bucket_access_role

问题:上面已给出,每当flink应用需要与S3存储桶对话时,它首先会扮演AccountB_Bucket_access_role角色并能够读取S3存储桶。但是设置AWS_PROFILE实际上会切换flink应用程序的角色,因此所有POD-ROLE权限都会丢失,并且flink应用程序的正常运行需要它们。

有一种方法,只能在读取S3存储桶时使用此AWS custom_profile,然后再切换到POD-ROLE

val flinkEnv: StreamExecutionEnvironment = AppUtils.setUpAndGetFlinkEnvRef(config.flink)
val textInputFormat = new TextInputFormat(new Path(config.path))
env
 .readFile(
    textInputFormat,
    config.path,
    FileProcessingMode.PROCESS_CONTINUOUSLY,
    config.refreshDurationMs
 )

这是我在flink作业中用来读取S3文件的东西。

1 个答案:

答案 0 :(得分:0)

Nvm,我们可以配置一个帐户的角色来从另一个帐户访问特定存储桶。 Access Bucket from another account