AWS Firehose 交叉 region/account 政策

AWS Firehose cross region/account policy

我正在尝试创建 Firehose 流,它可以通过 AWS Lambda 从账户 A 中的不同区域接收数据,并输出到账户 B 中的红移 table。为此,我创建了一个 IAM 角色账户 A:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "firehose.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

我给了它以下权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::b-bucket/*",
                "arn:aws:s3:::b-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "firehose:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "redshift:*"
            ],
            "Resource": "*"
        }
    ]
}

在帐户 B 上,我使用此信任策略创建了一个角色:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "firehose.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:ExternalId": "11111111111"
                }
            }
        }
    ]
}

我为该角色授予了以下访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::b-bucket",
                "arn:aws:s3:::b-bucket/*",
                "arn:aws:s3:::b-account-logs",
                "arn:aws:s3:::b-account-logs/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "firehose:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "redshift:*",
            "Resource": "arn:aws:redshift:us-east-1:cluster:account-b-cluster*"
        }
    ]
}

我还编辑了 S3 存储桶的访问策略以授予对我的帐户 A 角色的访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::11111111111:role/AccountAXAccountBPolicy"
            },
            "Action": "s3:*",
            "Resource": ["arn:aws:s3:::b-bucket","arn:aws:s3:::b-bucket/*"]
        }
    ]
}

但是,none 是有效的。当我尝试在账户 A 中创建流时,它不会列出账户 B 中的存储桶,也不会列出 redshift 集群。有什么办法可以做到这一点吗?

没有

Amazon Kinesis Firehose 只会输出到同一区域的 Amazon S3 存储桶和 Amazon Redshift 集群。

但是,任何东西都可以通过简单地调用适当的端点将信息发送到 Kinesis Firehose。因此,您可以让任何 AWS 账户和任何区域(或 Internet 上的任何地方)中的应用程序将数据发送到 Firehose,然后将其存储在与 Firehose 位于同一区域的存储桶或集群中。

约翰的回答是半正确的。我建议 Redshift 集群的帐户所有者创建 FireHose Stream。通过 CLI 创建需要您提供用户名和密码。让集群所有者创建流并在流上共享 IAM 角色权限对于安全性和凭证更改而言更安全。此外,您无法创建访问区域外数据库的流,因此让交付应用程序访问正确的流和区域。

继续阅读下文,了解如何创建跨账户流。

在我的例子中,我可以访问这两个帐户,并且为了减少更改量和便于监控,我在帐户 A 端创建了流。

以上权限是正确的,但是您不能通过 AWS 控制台创建从账户 A 到账户 B 的 Firehose 流。您需要通过 AWS Cli 来完成:

 aws firehose create-delivery-stream --delivery-stream-name testFirehoseStreamToRedshift 
 --redshift-destination-configuration 'RoleARN="arn:aws:iam::11111111111:role/AccountAXAccountBRole", ClusterJDBCURL="jdbc:redshift://<cluster-url>:<cluster-port>/<>",
 CopyCommand={DataTableName="<schema_name>.x_test",DataTableColumns="ID1,STRING_DATA1",CopyOptions="csv"},Username="<Cluster_User_name>",Password="<Cluster_Password>",S3Configuration={RoleARN="arn:aws:iam::11111111111:role/AccountAXAccountBRole",
 BucketARN="arn:aws:s3:::b-bucket",Prefix="test/",CompressionFormat="UNCOMPRESSED"}'

您可以通过在另一个 AWS 账户上创建一个测试 table 来测试它:

create table test_schema.x_test
(
    ID1 INT8 NOT NULL,
    STRING_DATA1 VARCHAR(10) NOT NULL
)
distkey(ID1)
sortkey(ID1,STRING_DATA1);

您可以像这样发送测试数据:

aws firehose put-record  --delivery-stream-name testFirehoseStreamToRedshift --record '{"DATA":"1,\"ABCDEFGHIJ\""}'

这与上面的权限配置应该为您创建跨帐户访问。

文档:
创建流 - http://docs.aws.amazon.com/cli/latest/reference/firehose/create-delivery-stream.html

记录 - http://docs.aws.amazon.com/cli/latest/reference/firehose/put-record.html