1

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

{
    "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": "*"
        }
    ]
}

在 Account BI 上,使用此信任策略创建了一个角色:

{
    "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/*"]
        }
    ]
}

但是,这些都不起作用。当我尝试在账户 A 中创建流时,它没有列出账户 B 中的存储桶,也没有列出 redshift 集群。有什么办法可以使这项工作?

4

2 回答 2

2

约翰的回答是半正确的。我建议 Redshift 集群的帐户所有者创建 FireHose 流。通过 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 账户上创建一个测试表来对此进行测试:

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

于 2017-04-19T01:05:35.293 回答
1

不。

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

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

于 2017-04-18T05:18:34.090 回答