标签: aws-php-sdk

使用AWS SNS与直接使用Apple的APNS的好处

我有一个应用程序逻辑,要求我将用户设备分段为订阅不同类型的"频道/主题"的组.

然后,我想向特定主题或频道的所有订阅者发送广播消息.

我可以拥有多达500,000个主题或频道,每个频道有多达20,000个订阅者.

由于AWS SNS每个频道限制3,000个主题和10,000个订阅者,因此他们的FAQ建议您使用直接寻址,这意味着我自己逐个发送.如果我们的产量很高,他们建议我们也走这条路.

AWS SNS没有批量发布功能,所以我实际上需要为每个订阅者发出一个SNS发布请求,这可以挂载到数万个请求.

所以我发现AWS-PHP-SDK是建立在Guzzle之上的,并且支持通过多卷曲进行并行请求处理,但即便如此,如果我同时运行20个连接,我仍然需要提出这么多请求...是那甚至高效吗?如果我有大量的话,为什么这是推荐的方式呢?

还有另一个问题,如果我需要逐个向每个用户发送相同的消息,为什么要使用SNS?

Apple APNS服务通过打开TCP连接和写入请求的字节来工作,每个请求都有不同的订阅者详细信息,但我可以编写字节而不需要构建PHP请求和处理20个进程的开销.将消息传递给所有主题/频道订阅者的方式不会更快吗?

我对这类案例中AWS SNS服务的权衡和附加价值感到有些困惑.我非常感谢有过这方面经验的人或AWS员工的一些见解.

谢谢

php amazon-web-services apple-push-notifications amazon-sns aws-php-sdk

7
推荐指数
1
解决办法
3443
查看次数

删除时拒绝 AWS S3 访问

我有一个可以毫无问题地写入的存储桶。但是,当我尝试删除对象时,出现错误...

AccessDeniedException in NamespaceExceptionFactory.php line 91
Run Code Online (Sandbox Code Playgroud)

按照这里非常基本的例子,我想出了这个命令......

$result = $s3->deleteObject(array(
                'Bucket' => $bucket,
                'Key'    => $keyname
            ));  
Run Code Online (Sandbox Code Playgroud)

我已经根据我发现的其他教程和问题尝试了这种变化。

$result = $s3->deleteObject(array(
                'Bucket' => $bucket,
                'Key'    => $keyname,
                'Content-Type'  => $contentType,
                'Content-Length' => 0
            ));  
Run Code Online (Sandbox Code Playgroud)

但一切都会产生同样的错误。有什么建议?

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

7
推荐指数
2
解决办法
1万
查看次数

如何使用 AWS-cognito 进行处理 NEW_PASSWORD_REQUIRED 挑战

当我使用下面的代码时:

$result = $this->client->adminInitiateAuth([
                'AuthFlow' => 'ADMIN_NO_SRP_AUTH',
                'ClientId' => $this->client_id,
                'UserPoolId' => $this->userpool_id,
                'AuthParameters' => [
                    'USERNAME' => $username,
                    'PASSWORD' => $password,
                ],
            ]);
Run Code Online (Sandbox Code Playgroud)

我收到的回复是sessionchallengeName :NEW_PASSWORD_REQUIRED。由此如何AccessToken在AWS-cognito中生成?

php laravel aws-php-sdk amazon-cognito aws-sdk

7
推荐指数
1
解决办法
1万
查看次数

使用PHP SDK进行S3批处理/并行上载错误

我按照这些代码批量PutObject进入S3.我使用的是最新的PHP SDK(3.x).但我得到:

传递给Aws\AwsClient :: execute()的参数1必须实现接口Aws\CommandInterface,给出数组

$commands = array();
$commands[] = $s3->getCommand('PutObject', array(
    'Bucket' => $bucket,
    'Key'    => 'images/1.jpg',
    'Body' => base64_decode( 'xxx' ),
    'ACL' => 'public-read',
    'ContentType' => 'image/jpeg'
));

$commands[] = $s3->getCommand('PutObject', array(
    'Bucket' => $bucket,
    'Key'    => 'images/2.jpg',
    'Body' => base64_decode( 'xxx' ),
    'ACL' => 'public-read',
    'ContentType' => 'image/jpeg'
));

// Execute the commands in parallel
$s3->execute($commands);
Run Code Online (Sandbox Code Playgroud)

amazon-s3 aws-php-sdk aws-sdk

6
推荐指数
1
解决办法
1623
查看次数

PHP中的AWS SNS HTTP订阅确认

我无法获得PHP中AWS SNS Http连接的确认。我的应用程序是在Laravel 5.1上开发的

在AWS中,我创建了一个主题并添加了一个订阅。我已将端点选择为HTTP并提供了URL http://myurl.com/sns

我的PHP代码如下

public function getSnsMessage()
{
   $message = Message::fromRawPostData();
   $validator = new MessageValidator();
   // Validate the message and log errors if invalid.
   try {
       $validator->validate($message);
    }catch (InvalidSnsMessageException $e) {
       // Pretend we're not here if the message is invalid.
       http_response_code(404);
        error_log('SNS Message Validation Error: ' . $e->getMessage());
       die();
    }

    // Check the type of the message and handle the subscription.
   if ($message['Type'] === 'SubscriptionConfirmation') {
       // Confirm the subscription by sending a GET request …
Run Code Online (Sandbox Code Playgroud)

php amazon-web-services amazon-sns aws-php-sdk laravel-5.1

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

AWS SNS:为什么我的“幽灵”订阅没有显示在主题中

我在使用 Amazon AWS SNS 时遇到了一个奇怪的问题:使用aws-php-sdk(3.112.7)创建订阅和主题时,总是有“幽灵”或“隐形”订阅。

AWS 控制台屏幕截图

如您所见,此订阅存在于“订阅”选项卡中。但是,当我单击主题链接(此处cav_56826)时,我看不到任何订阅

AWS 主题屏幕截图

你们已经有类似的问题了吗?这怎么会发生?

这是我的简化代码:

  try
    {
        $arn = "arn:aws:sns:eu-west-1:XXXXXXXXXXXXXXXXX:app/APNS_VOIP_SANDBOX/ios_cav";
        $topics = array("allUsers", "cav_56826");
        $topicsToSubcribe = array();

        foreach ($topics as $topic)
        {
            $res = $this->snsClient->createTopic(['Name' => $topic]);
            if ($res->get('@metadata')['statusCode'] == 200)
            {
                array_push($topicsToSubcribe, $res->get('TopicArn'));
            }
            else
            {
                throw new Exception("An error occured during Amazon SNS createTopic", $res->get('@metadata')['statusCode']);
            }
        }

        $SNSEndPointData = $this->snsClient->createPlatformEndpoint([
            'PlatformApplicationArn' => $arn,
            'Token'                  => $token
        ]);

        foreach ($topicsToSubcribe as $topic)
        {
            $this->snsClient->subscribe([
                'Protocol' => "application",
                'Endpoint' …
Run Code Online (Sandbox Code Playgroud)

push-notification amazon-web-services amazon-sns aws-php-sdk

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

凭证必须是带有 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
查看次数

如何使用 CloudFront 从 AWS S3 安全地播放 .m3u8 流文件?

我正在使用 CloudFront 签名 URL 来显示来自 S3 的图像和视频以进行保护。

除了 .m3u8 文件,它适用于图像和其他视频。

我使用了 AWS PHP SDK,这是我的代码。

<?php
    // Instantiate the CloudFront client with your AWS credentials
    $cloudFrontClient    =  new CloudFrontClient(array(
        'region'        => env('AWS_DEFAULT_REGION'),
        'version'       => 'latest',
        'http'          => [ 'verify' => false ],
        'credentials'   => array(
            'key'       => env('AWS_ACCESS_KEY_ID'),
            'secret'    => env('AWS_SECRET_ACCESS_KEY'),
    )));
    
    // Create a signed URL for the resource
    $resourceKey      =  'https://abcdefg.cloudfront.net/test/file_1000k.m3u8';
        $expires          =  time() + 3600;
        $signedUrl        =  $cloudFrontClient->getSignedUrl([
            'url'         => $resourceKey,
            'expires'     => $expires,
            'private_key' => public_path().'/pk-ABCD123.pem',
            'key_pair_id' …
Run Code Online (Sandbox Code Playgroud)

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

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

将元数据添加到 S3 对象,同时保留现有元数据和 ACL

我正在寻找一种以编程方式将特定元数据添加到一组 S3 对象的方法。我最近更新了项目中的代码,以便在将对象上传到 S3 时设置“Cache-Control: max-age”和“Expires”,但现在我正在尝试为现有 S3 对象设置这些值。我不希望更改任何其他内容,例如 ACL 或任何其他元数据。

我曾尝试使用 AWS CLI 来实现这一点,但遇到了一些问题。我的存储桶有公共和非公共对象,所以我不能只将 acl 设置为“公共读取”。我希望 ACL 保持不变,但如果我什么都不设置,它们都会变成私有的。另外,我想添加元数据,但保持任何现有的元数据完好无损。这是我尝试过的 cli 调用:

aws s3 cp s3://my-bucket s3://my-bucket --acl public-read --recursive --metadata-directive=REPLACE --cache-control max-age=2592000 --expires 'Wed, 29 July 2020 00:00:01 GMT'

我正在使用 AWS PHP SDK,但对其他方法持开放态度。

为了维护相同的元数据,我尝试使用headObject获取现有的标头数据......但它返回了很多值。我可以迭代它们,但我不知道我需要再次设置哪些来维护所有内容。

为了维护相同的 ACL,我尝试使用getObjectAcl后跟putObjectAcl... 但我很确定这不会在所有情况下都有效(我很确定我将ACL值设置为public-readprivate不够健壮的逻辑对于所有情况...)。

$acl_result = $s3->getObjectAcl([
    'Bucket' => $bucket,
    'Key' => $object_key
]);

$grants = $acl_result->get('Grants');
$owner = $acl_result->get('Owner');

...

$public = false;
foreach($grants as …
Run Code Online (Sandbox Code Playgroud)

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

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

命名 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
查看次数