标签: aws-php-sdk

在aws-php-sdk ListObjects上放置一个"sort_by"

在我目前的项目中,我需要每4秒检查一次S3存储桶内容以获取新文件.

每次使用该服务时,此脚本将运行大约3个小时,并且在一个前缀的末尾将有大约2700个文件.

这是我列出这些文件的功能:

public function listFiles($s3Prefix, $limit, $get_after = ''){
    $command = $this->s3Client->getCommand('ListObjects');
    $command['Bucket']  = $this->s3_bucket;
    $command['Prefix']  = $s3Prefix;
    $command['MaxKeys'] = $limit;
    $command['Marker']  = $s3Prefix.'/'.$get_after;

    //command['Query'] = 'sort_by(Contents,&LastModified)';

    $ret_s3 = $this->s3Client->execute($command);

    $ret['truncated'] = $ret_s3['IsTruncated'];
    $ret['files'] = $ret_s3['Contents'];

    return $ret;
}// listFiles
Run Code Online (Sandbox Code Playgroud)

我需要的是获取文件,按LastModified字段排序,所以我不需要获取超过2k的文件.是否有额外的参数,如

command['Query'] = 'sort_by(Contents,&LastModified)';
Run Code Online (Sandbox Code Playgroud)

在php API中添加?

----------已编辑------------

正如Abhishek Meena回答的那样,在shell中可以使用

aws s3api list-objects --bucket "bucket-name" --prefix "some-prefix" --query "Contents[?LastModified>=\`2017-03-08\`]"
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是如何在PHP中实现它.

PHP API: https://github.com/aws/aws-sdk-php

amazon-s3 aws-php-sdk

5
推荐指数
0
解决办法
609
查看次数

通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问

我正在尝试使用 AWS SDK PHP 生成的预签名帖子将文件(用于测试的图像)上传到我的 s3 存储桶。首先我生成预签名的帖子,然后我使用 Postman 或通过简单的 html 表单使用给定的 PostObjectV4 数据手动创建请求...填写完所有内容后,请求结果为“访问被拒绝”:-(。与客户端关联的用户生成 PostObjectV4 在相应的存储桶上已允许 s3:PutObject 策略。

我已经尝试过:

  • 将我的存储桶设置为公共写入,并且它有效!这表明我存在权限/政策问题...不幸的是我的存储桶不必公开...
  • 通过aws命令行上传文件,也可以

预签名后生成的 PHP 代码(数据位于 $postObject 中):

$assetAwsS3Key = $this->getAssetAwsS3Key($asset);

$options = [
    ['starts-with', '$key', 'myDir/'],
];

// Optional: configure expiration time string
$expires = '+24 hours';

// Set some defaults for form input fields
$formInputs = ['acl' => 'private'];

$postObject = new PostObjectV4(
    $this->buildAwsS3UserClient(),
    $this->awsBucketName,
    $formInputs,
    $options,
    $expires
);

// Get attributes to set on an HTML form, e.g., action, method, …
Run Code Online (Sandbox Code Playgroud)

php amazon-s3 amazon-iam aws-php-sdk

5
推荐指数
1
解决办法
2450
查看次数

如何在 PHPUnit 中模拟带注释的 AWS 方法?

我正在编写一个单元测试,我想检查该方法是否publish()被调用一次或多次。这是我整个测试课的一个片段:

<?php

namespace App\Tests\Unit;

use Aws\Sns\SnsClient;
use Exception;
use PHPUnit\Framework\TestCase;

class MyClassTest extends TestCase
{
    /** @var SnsClient */
    private $snsClient;

    public function setUp(): void
    {
        $this->snsClient = $this->getMockBuilder(SnsClient::class)->disableOriginalConstructor()->getMock();
    }

    /**
     * @throws Exception
     */
    public function testNoCaseIdentifierSns()
    {
        $this->snsClient->expects($this->once())->method('publish')->with([
            [
                'doc_id' => 1,
                'bucket' => 'some_bucket',
                'key'    => 'test.tiff/0.png'
            ],
            'topic_arn'
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行上面的代码时,出现以下错误:

尝试配置方法“publish”,但无法配置,因为它不存在、尚未指定、是最终的或静态的

我想这里的问题是AWS中的方法定义为@method(参见此处):

* @method \Aws\Result publish(array $args = [])
Run Code Online (Sandbox Code Playgroud)

可以模拟该方法吗?我在这里缺少什么?

更新

在遵循评论建议后,我将代码转换为以下内容:

$this->snsClient->expects($this->once())->method('__call')->with([
    'Message'  => json_encode([
        'doc_id' => …
Run Code Online (Sandbox Code Playgroud)

php phpunit aws-php-sdk

5
推荐指数
1
解决办法
2048
查看次数

凭证必须是带有 SQS 的 PHP SDK 上的 Aws\\Credentials\\CredentialsInterface 错误的实例

SQS我正在尝试使用 php SDK从 AWS 中删除一条消息。我有以下配置。

$sqsClient = new SqsClient([
            'version' => '2012-11-05',
            'region'  => 'us-east-1',
            'credentials' => [
                'key' => KEY,
                'secret' => SECRET
            ]
        ]);
Run Code Online (Sandbox Code Playgroud)

然后我尝试删除如下:

$sqsClient->deleteMessage([
                'QueueUrl' => quque-url
                'ReceiptHandle' => handle
            ]);
Run Code Online (Sandbox Code Playgroud)

我在初始化时收到以下错误:

Credentials must be an instance of Aws\\Credentials\\CredentialsInterface, an associative array that contains \"key\", \"secret\", and an optional \"token\" key-value pairs, a credentials provider function, or false."

我使用的凭据是正确的。在我没有传递配置之前,也出现了同样的错误。如何解决这个问题?

php amazon-sqs amazon-web-services aws-php-sdk

5
推荐指数
1
解决办法
6677
查看次数

命名 AWS EC2 安全组 IP 权限规则

我使用的是 AWS PHP SDK 版本 3。我能够使用 API 创建安全组,以及创建 IP 权限规则。我不明白的是如何为 IP 权限规则命名。

这是我所拥有的:

$params = 
[
    'Description' => 'My Security Group',
    'GroupName' => 'my_security_group',
    'VpcId' => 'vpc-a9d2h3d7',
    'TagSpecifications' => [
        [
            'ResourceType' => 'security-group',
            'Tags' =>
            [
                ['Key' => 'Name', 'Value' => 'My Security Group']
            ]                
        ]
    ],
];

$Ec2Client->createSecurityGroup($params);
Run Code Online (Sandbox Code Playgroud)

至此群组就创建完成了

然后我创建一个 IP 权限规则:

$ip_permissions = [
    'GroupName' => 'my_security_group',
    'FromPort' => 0, 
    'ToPort' => 65535, 
    'IpProtocol' => 'tcp', 
    'IpRanges' => [['CidrIp' => 'xx.xxx.xx.xxxx/32', 'Description' => 'Main Office']],
];

$Ec2Client->authorizeSecurityGroupIngress($ip_permissions); …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-php-sdk aws-sdk

5
推荐指数
1
解决办法
254
查看次数

在AWS PHP的上传功能中指定Content-Type

我正在将我的代码从AWS PHP SDK1迁移到SDK2(https://github.com/aws/aws-sdk-php).

我有一个图像上传器.在我以前的版本中,我会指定我的图像的Content-Type,如下所示:

$response = $this->s3->create_object(
                $bucket,
                $key,
                array(
                    'fileUpload'=>$file_resource,
                    'contentType'=>$mime, 
                    'acl' => AmazonS3::ACL_PUBLIC,
                    )
                );
Run Code Online (Sandbox Code Playgroud)

这是我的新版本:

$response = $this->s3->upload(
                    $bucket, 
                    $key, 
                    $file_resource, 
                    'public-read',
                    array('params' => array('Metadata' => array('ContentType'=>$mime)))
                    );
Run Code Online (Sandbox Code Playgroud)

我试过的ContentType不同的拼法,在S3网站修改它的名字看起来像"X-AMZ-元的contentType",而"的ContentType"的值是默认的"二进制/八位字节流".

我也尝试过使用EntityBody功能,但结果相同:

$response = $this->s3->upload(
                    $this->bucket, 
                    $to, 
                    EntityBody::factory($file_resource), 
                    'public-read',
                    array('params' => array('Metadata' => array('ContentType'=>$mime)))
                    );
Run Code Online (Sandbox Code Playgroud)

如何在此新API中设置内容类型?

编辑:我在文档中的某处看到:

AWS SDK for PHP将尝试自动确定用于存储对象的最合适的Content-Type标头.如果您使用的是较不常见的文件扩展名并且未自动添加Content-Type标头,则可以通过将ContentType选项传递给操作来添加Content-Type标头.

首先,我正在上传简单的图像,但根据我的S3仪表板,它们被上传为'binary/octet-stream'.关于他们的第二点,我尝试过多种具有'ContentType'的数组组合我不知道为什么它不起作用......

amazon-s3 amazon-web-services aws-php-sdk

4
推荐指数
2
解决办法
6538
查看次数

Amazon SES 是否支持 UTF-8 电子邮件地址?

我试图找到这方面的详细信息,但找不到任何确认。我正在使用 PHP SDK 并尝试了以下测试(下面的电子邮件是一个示例,但 gmail 支持电子邮件中的 UTF-8 字符):

  • 使用 SES 发送电子邮件至myemail+?@gmail.com

我实际上发送了“?” 就像使用 PHP SDK 并查看它在 POST 请求正文中编码(URL)的查询一样:

Destination.ToAddresses.member.1=myemail%2B%E2%9C%96%40gmail.com

这是我从 SES 回复中得到的信息:

<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
  <Error>
    <Type>Sender</Type>
    <Code>InvalidParameterValue</Code>
    <Message>Local address contains control or whitespace</Message>
  </Error>
  <RequestId>f28c2325-5c09-11e6-9156-ef3e33b8e223</RequestId>
</ErrorResponse>
Run Code Online (Sandbox Code Playgroud)

我错过了什么还是不支持?如果不是,是否有计划支持它?

php amazon-web-services amazon-ses aws-php-sdk

4
推荐指数
2
解决办法
2904
查看次数

从 PHP SDK 获取 AWS IAM 凭证

我经常使用 AWS 服务,并且当我连接 Amazon 时,我的 PHP SDK 自动从我的 ec2 实例检索凭证。

我现在有一个想要使用的库,在实例化该类时还需要包含我的 AWS 密钥和访问密钥。

如何通过 AWS PHP SDK 检索当前的访问令牌和密钥,这样我就不会将密钥硬编码到我的应用程序中?

php amazon-web-services amazon-iam aws-php-sdk

3
推荐指数
1
解决办法
2154
查看次数

AWS SQS 错误:SignatureDoesNotMatch HTTP 错误:403

我正在制作一个面部追踪思维视频AWS Rekognition( StartFaceSearch)。它将返回作业 ID。我已经设置了所有SQS SNS部分。我的问题是我无法使用receiveMessage(). 甚至listQueues()也不工作。它给出了以下错误。

“ https://sqs.us-east-1.amazonaws.com ”上的“ListQueues” ;AWS HTTP 错误:客户端错误:POST https://sqs.us-east-1.amazonaws.com导致403 Forbidden响应:< ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">发件人<代码>S(已截断...)SignatureDoesNotMatch ( client): 我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。

此请求的规范字符串应该是 'POST / .... < continue.............

代码如下。AWS PHP 开发工具包版本 3.64.11。

$queueUrl = "https://sqs.us-east-1.amazonaws.com/xxxxxxx/facetrackingreceive";
        // Get the client from the builder by namespace
        $sqs_client = new SqsClient(array(
            'credentials' => array(
                'key'    => 'xxxxxxxxxx',
                'secret' => 'xxxxxxxxxxxxxxxxxxxxxxx',
            ),
            'version' => '2012-11-05',
            'region'  => 'us-east-1',
            'http' => …
Run Code Online (Sandbox Code Playgroud)

php amazon-sqs amazon-web-services laravel aws-php-sdk

3
推荐指数
1
解决办法
4585
查看次数

S3 listObjectsV2 - StartAfter 不显示预期结果

我试图在某个标识符之后获取存储桶中的所有文件。

这是我的代码,省略了不相关的部分。

require_once LIB . DS . 'Aws/vendor/autoload.php';
use Aws\S3\S3Client as S3Client;
use Aws\Credentials as Credentials;

$s3 = new S3Client([
        'region'      => $region,
        'version'     => 'latest',
        'key'    => AWS_KEY,
        'secret' => AWS_SECRET,
        'credentials' => $credentials
    ]
);

$data = $s3->listObjectsV2(
                           [
                               'Bucket' => <MY BUCKET>,
                               // the response content should be after this record
                               'StartAfter' => '302760677',
                               'MaxKeys' => 2
                          ]);
print_r($data);
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下:

Aws\Result Object
(
    [data:Aws\Result:private] => Array
        (
            [IsTruncated] => 1
            [Contents] => Array
                (
                    [0] => Array …
Run Code Online (Sandbox Code Playgroud)

php amazon-s3 amazon-web-services aws-php-sdk aws-sdk

3
推荐指数
1
解决办法
3501
查看次数