我想使用boto3将文件上传到AWS S3。但是我只能通过不受我控制的Web服务来临时访问S3。我提供了以下凭据信息:
class Foo
{
public Foo(int length)
{
// toggle these to see the issue
Bars = InitializeWithYield(length);
//Bars = InitializeCalledFromConstructor(length);
}
public void DoSomething()
{
IBar firstBar = Bars.FirstOrDefault(); // calls InitializeWithYield if in constructor
IList<IBar> listOfBar = Bars.ToList(); // calls InitializeWithYield if in constructor
Console.Write($"First Bar has value {b.Value}");
}
IEnumerable<IBar> Bars { get; }
// shorter syntax, but gets called every time the Bars property is used
// also, not called from constructor
IEnumerable<IBar> InitializeWithYield(int number)
{
for (int i = 0; i < number; i++)
{
yield return new Bar(i);
}
}
// this only gets called from the constructor, which is what I want
IEnumerable<IBar> InitializeCalledFromConstructor(int number)
{
IList<IBar> result = new List<IBar>();
for (int i = 0; i < number; i++)
{
result.Add(new Bar(i));
}
return result;
}
}
据我所知,这些信息可以用于POST请求。但是我无法找到如何结合boto3命令使用此信息
{
"key": <string>,
"x-amz-algorithm": <string>,
"x-amz-credential": <string>,
"x-amz-date": <string>,
"policy": <string>,
"x-amz-signature": <string>
}
通常需要 aws_access_key_id 和 aws_secret_access_key 。 帖子here暗示,这应该可行:
您应该通过AWS安全令牌服务(STS)生成临时凭证,而不是对URL(通常是通过Web浏览器进行呼叫时使用的URL)进行签名
[...]
然后,您的Python应用会在调用boto时使用这些凭据
但是我无法找出如何向boto客户端提供临时凭证。
答案 0 :(得分:2)
似乎您已获得Amazon S3 pre-signed URLs。这是一种通过授权请求的散列签名来授予对特定Amazon S3命令的临时访问权的方法。
使用访问密钥和秘密密钥生成请求时,您无法从请求中提取秘密密钥。 (相反,它是用来创建签名的。)因此,您不能使用boto3使用提供的信息来发出请求。这完全是故意的。
使用安全令牌服务生成临时凭据不同于生成预签名URL。 STS将提供boto3可以使用的凭据。但是,在为您提供访问信息时,这并不是他们要做的。