关于通过AWS CLI调用Kinesis put-record上传CSV文件的技术问询
解决AWS Kinesis Put-Record上传S3中CSV文件的问题
我明白你遇到的问题了——直接把S3路径传给--data参数时,Kinesis会把路径本身当成字符串上传,而不是去读取S3里的CSV文件内容。这是因为AWS CLI的kinesis put-record命令本身不会自动解析S3路径并拉取文件,--data只接受字符串、本地文件内容或者标准输入流。
下面给你几个可行的解决方案:
方案1:先下载S3文件到本地再上传
这是最直观的方法,先把S3上的CSV文件下载到本地临时文件,再读取文件内容传给Kinesis命令:
# 1. 从S3下载CSV到本地临时文件 aws s3 cp s3://cona-sample-salesforce-data/testdata/your-target-file.csv ./temp-kinesis.csv # 2. 读取本地文件内容并上传到Kinesis aws kinesis put-record \ --cli-binary-format raw-in-base64-out \ --stream-name NagaTZeusStream \ --partition-key 1 \ --data "$(cat ./temp-kinesis.csv)" \ --region us-west-2
注意替换your-target-file.csv为你实际的文件名,另外记得把region改成正确的(比如你示例里的us-west-2,之前的命令里写的us-west是无效的region)。
方案2:直接通过管道传递(无需本地文件)
如果不想在本地保存文件,可以利用AWS CLI的标准输入输出管道,直接把S3文件的内容传给Kinesis命令:
aws s3 cp s3://cona-sample-salesforce-data/testdata/your-target-file.csv - | \ aws kinesis put-record \ --cli-binary-format raw-in-base64-out \ --stream-name NagaTZeusStream \ --partition-key 1 \ --data - \ --region us-west-2
这里的-是关键:
- 第一个
-表示aws s3 cp把文件内容输出到标准输出(stdout) - 第二个
-表示aws kinesis put-record从标准输入(stdin)读取--data的内容
额外提示:如果CSV是多记录文件
如果你的CSV文件里每行是一条独立的业务记录,用put-record逐条上传效率很低,推荐用put-records批量上传。比如结合awk和jq把每行转换成Kinesis要求的格式:
aws s3 cp s3://cona-sample-salesforce-data/testdata/your-multi-record.csv - | \ awk '{printf "{\"Data\":\"%s\",\"PartitionKey\":\"1\"}\n", $0}' | \ jq -s '.' | \ aws kinesis put-records \ --cli-binary-format raw-in-base64-out \ --stream-name NagaTZeusStream \ --records - \ --region us-west-2
这个命令会把CSV的每一行转换成一条Kinesis记录,然后批量上传,比逐条调用put-record高效得多。
内容的提问来源于stack exchange,提问作者nagasatish chilakamarti
相关产品推荐
相关产品推荐

