我需要一种方法来允许第三方应用将txt文件(350KB并缓慢增长)上传到AWS中的s3存储桶。我希望有一个涉及端点的解决方案,他们可以使用标头中的某些授权密钥等进行PUT。该桶不能公开给所有人。
我读过这个:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html 而这:http://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
但似乎无法找到我正在寻找的解决方案。
答案 0 :(得分:1)
我建议使用AWS API网关,lambda函数和最终S3的组合。
您的客户将调用API网关端点。 端点将执行AWS lambda函数,然后将该文件写入S3。 只有lambda函数需要对存储桶的权限,因此存储桶将保持非公开和受保护。
如果您已经运行了EC2实例,则可以使用EC2实例上运行的自定义代码替换lambda部分,但使用lambda将允许您拥有无服务器'解决方案,自动缩放,没有分钟。每月费用。
答案 1 :(得分:0)
我最终使用了AWS SDK。它可用于Java,.NET,PHP和Ruby,因此第三方应用程序使用其中之一的可能性非常高。见这里:http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpNET.html
在这种情况下,只需使用SDK上传文件即可。我在我的本地机器上运行的.NET中编写了一个示例版本。首先,安装AWSSDK Nuget包。然后,这是代码(取自AWS样本):
C#:
var bucketName = "my-bucket";
var keyName = "what-you-want-the-name-of-S3-object-to-be";
var filePath = "C:\\Users\\scott\\Desktop\\test_upload.txt";
var client = new AmazonS3Client(Amazon.RegionEndpoint.USWest2);
try
{
PutObjectRequest putRequest2 = new PutObjectRequest
{
BucketName = bucketName,
Key = keyName,
FilePath = filePath,
ContentType = "text/plain"
};
putRequest2.Metadata.Add("x-amz-meta-title", "someTitle");
PutObjectResponse response2 = client.PutObject(putRequest2);
}
catch (AmazonS3Exception amazonS3Exception)
{
if (amazonS3Exception.ErrorCode != null &&
(amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
||
amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
{
Console.WriteLine("Check the provided AWS Credentials.");
Console.WriteLine(
"For service sign up go to http://aws.amazon.com/s3");
}
else
{
Console.WriteLine(
"Error occurred. Message:'{0}' when writing an object"
, amazonS3Exception.Message);
}
}
的Web.config:
<add key="AWSAccessKey" value="your-access-key"/>
<add key="AWSSecretKey" value="your-secret-key"/>
您可以通过在AWS账户中创建新用户来获取accesskey和密钥。当您这样做时,他们会为您生成这些内容并提供下载。然后,您可以将AmazonS3FullAccess策略附加到该用户,并将文档上载到S3。
注意:这是一个POC。在使用此实际的第三方应用程序中,出于安全目的,他们不想在Web配置中对凭据进行硬编码。见这里:http://docs.aws.amazon.com/AWSSdkDocsNET/latest/V2/DeveloperGuide/net-dg-config-creds.html