我有一个应用程序逻辑,要求我将用户设备分段为订阅不同类型的"频道/主题"的组.
然后,我想向特定主题或频道的所有订阅者发送广播消息.
我可以拥有多达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
我有一个可以毫无问题地写入的存储桶。但是,当我尝试删除对象时,出现错误...
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)
但一切都会产生同样的错误。有什么建议?
当我使用下面的代码时:
$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)
我收到的回复是session和challengeName :NEW_PASSWORD_REQUIRED。由此如何AccessToken在AWS-cognito中生成?
我按照这些代码批量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) 我无法获得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) 我在使用 Amazon AWS SNS 时遇到了一个奇怪的问题:使用aws-php-sdk(3.112.7)创建订阅和主题时,总是有“幽灵”或“隐形”订阅。
如您所见,此订阅存在于“订阅”选项卡中。但是,当我单击主题链接(此处cav_56826)时,我看不到任何订阅。
你们已经有类似的问题了吗?这怎么会发生?
这是我的简化代码:
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
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."
我使用的凭据是正确的。在我没有传递配置之前,也出现了同样的错误。如何解决这个问题?
我正在使用 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) 我正在寻找一种以编程方式将特定元数据添加到一组 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-read或private不够健壮的逻辑对于所有情况...)。
$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) 我使用的是 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) aws-php-sdk ×10
amazon-s3 ×4
php ×4
amazon-sns ×3
aws-sdk ×3
acl ×1
amazon-sqs ×1
laravel ×1
laravel-5.1 ×1
metadata ×1