- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 C#,但我相信这个问题在任何 AWS SDK 中都是一样的。
我正在尝试以编程方式验证主题是否可以将消息发送到队列(实际上并不是尝试添加权限,只是检查它是否存在)。
到目前为止,我找到的唯一方法是扫描队列策略以查找与主题 ARN 匹配的语句,即:
policy.Statements.Any(
statement =>
statement.Effect == Statement.StatementEffect.Allow
&& statement.Principals.Any(
principal => string.Equals(
principal.Id,
Principal.AllUsers.Id,
StringComparison.OrdinalIgnoreCase))
&& statement.Actions.Any(
identifier => string.Equals(
identifier.ActionName,
SQSActionIdentifiers.SendMessage.ActionName,
StringComparison.OrdinalIgnoreCase))
&& statement.Resources.Any(resource => resource.Id == queueArn)
&& statement.Conditions.Any(
condition =>
(string.Equals(
condition.Type,
ConditionFactory.StringComparisonType.StringLike.ToString(),
StringComparison.OrdinalIgnoreCase)
|| string.Equals(
condition.Type,
ConditionFactory.StringComparisonType.StringEquals.ToString(),
StringComparison.OrdinalIgnoreCase)
|| string.Equals(
condition.Type,
ConditionFactory.ArnComparisonType.ArnEquals.ToString(),
StringComparison.OrdinalIgnoreCase)
|| string.Equals(
condition.Type,
ConditionFactory.ArnComparisonType.ArnLike.ToString(),
StringComparison.OrdinalIgnoreCase))
&& string.Equals(
condition.ConditionKey,
ConditionFactory.SOURCE_ARN_CONDITION_KEY,
StringComparison.OrdinalIgnoreCase)
&& condition.Values.Contains(topicArn)))
顺便说一下,这与调用 SubscribeQueueAsync 时在 AWS SDK 中完成的方式类似(请参阅 corresponding code on github )。
我对这种方法的问题是感觉它有多脆弱。例如,如果条件有通配符怎么办?如果存在针对特定委托(delegate)人而不是所有委托(delegate)人的授权怎么办?
所以我想我可能会使用 IAM,特别是 SimulatePrincipalPolicy或 SimulateCustomPolicy .它们可以用于此吗?
我是这样想的:
var simulatePrincipalPolicyRequest = new SimulatePrincipalPolicyRequest
{
ActionNames = { SQSActionIdentifiers.SendMessage.ActionName },
ResourceArns = { queueArn },
PolicySourceArn = topicArn
};
var response = await _iamService.SimulatePrincipalPolicyAsync(
request: simulatePrincipalPolicyRequest,
cancellationToken: cancellationToken);
本来可以,但我得到了 Amazon.IdentityManagement.Model.InvalidInputException : Could not extract entity from ARN : arn:aws:sns:eu-west-1:<accountid>:<topicname>
结果。
我想这可能与 CallerArn 属性有关?我注意到发件人帐户 ID 的用户 key 在队列从主题 (AIDA******************) 收到的消息中似乎始终相同。
不确定我正在尝试的是否可行...
最佳答案
开箱即用,您不能使用 SimulatePrincipalPolicy
( docs ) 检查服务是否具有 IAM 权限:
The entity can be an IAM user, group, or role. If you specify a user, then the simulation also includes all of the policies that are attached to groups that the user belongs to.
如果您查看 CallerArn
property您获得的 SimulatePolicyRequest
类:
You can specify only the ARN of an IAM user. You cannot specify the ARN of an assumed role, federated user, or a service principal.
我使用 powershell SDK 对此进行了测试 - 它在 .net 上运行并得到了同样的错误。
Test-IAMPrincipalPolicy -ActionName 'sqs:SendMessage' -PolicySourceArn arn:aws:sns:::sim-test -ResourceArn arn:aws:sqs:::sim-test
Test-IAMPrincipalPolicy : Could not extract entity from ARN : arn:aws:sns:::sim-test
可能的解决方案该函数确实适用于 IAM Service Roles .您可以在 IAM 中创建一个服务角色 delegates允许 SNS 向 SQS 发送消息。如果您能够为 SNS 创建服务角色,那么您将能够使用 SimulatePrincipalPolicy 函数。
我在 PS 中再次测试了这个。首先,我在 IAM 控制台中创建了服务角色:
您现在已将某些 CloudWatch 权限委派给 SNS。我们将在几秒钟内删除它,但现在我至少可以调用该函数,传入策略 ARN:
Test-IAMPrincipalPolicy -ActionName 'sqs:SendMessage' -PolicySourceArn arn:aws:iam:::role/sim-test-servicerole -ResourceArn arn:aws:sqs:::sim-test
EvalActionName : sqs:SendMessage
EvalDecision : implicitDeny
EvalDecisionDetails : {}
EvalResourceName : arn:aws:sqs:::sim-test
MatchedStatements : {}
MissingContextValues : {}
OrganizationsDecisionDetail :
ResourceSpecificResults : {arn:aws:sqs:::sim-test}
请注意,EvalDecision 是 implicitDeny。
现在您可以编辑创建的角色。删除Cloudwatch策略,添加相关SQS策略,再次测试:
EvalActionName : sqs:SendMessage
EvalDecision : allowed
EvalDecisionDetails : {}
EvalResourceName : arn:aws:sqs:::sim-test
MatchedStatements : {AmazonSQSFullAccess}
MissingContextValues : {}
OrganizationsDecisionDetail :
ResourceSpecificResults : {arn:aws:sqs:::sim-test}
如果您不能/不会为 SNS 设置服务角色,那么我认为唯一的方法就是像您已经完成的那样抓取策略。
经过进一步测试,虽然上面的功能可以正常工作,但我实际上无法让SNS登陆SQS!所以这是一个误报,我认为你又在废除政策了。
关于c# - 以编程方式验证 SNS 主题权限以将消息发送到 SQS(使用 IAM?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51898598/
我在 lambda 中有以下代码: entries = [ { "Id": str(index), "MessageAttribut
我正在构建一个无服务器应用程序,它在资源中定义了一个 SQS 队列,如下所示: resources: Resources: TheQueue: Type: "AWS:SQS:Q
我正在使用无服务器框架来使用来自 SQS 的消息。一些发送到队列的消息不会被消费。他们直接进入飞行中的 SQS 状态,然后从那里进入我的死信队列。当我查看我的消费者日志时,我可以看到它消费并成功处理了
我们的亚马逊 SQS 队列没有收到来自亚马逊 MWS 的 AnyOfferChanged 通知消息。 我们发送一个测试通知,当我们收到通知时,它会被发送到队列并可用。 我们已经设置了两个 AWS 账户
我想知道最后一条消息何时发布到 SQS 队列。 查看队列属性(通过 CLI 或其他方式),我看不到任何合适的内容 - 只能看到队列属性最后一次修改的时间。 如果有什么技巧可以找到这个(在不了解客户的情
我正在使用无服务器框架来使用来自 SQS 的消息。一些发送到队列的消息不会被消费。他们直接进入飞行中的 SQS 状态,然后从那里进入我的死信队列。当我查看我的消费者日志时,我可以看到它消费并成功处理了
我们的亚马逊 SQS 队列没有收到来自亚马逊 MWS 的 AnyOfferChanged 通知消息。 我们发送一个测试通知,当我们收到通知时,它会被发送到队列并可用。 我们已经设置了两个 AWS 账户
我正在使用 Amazon SQS 队列向外部系统发送通知。 如果使用 SQS 时 HTTP 请求失败 SendMessage ,我不知道消息是否已排队。我的默认策略是重试将消息发布到队列,但存在两次发
来自 SNS FAQ ,我知道 SNS 到 SQS 有重试策略,但是他们是否保证至少向 SQS 传递一条消息? 请给官方报价。 最佳答案 见 https://aws.amazon.com/sqs/fa
我是否可以使用 Amazon PHP SDK 根据消息 ID 从 SQS 队列中获取消息?我是否必须获取队列中的所有消息,然后在我的服务器上对其进行过滤? 我的服务器收到一个带有队列消息 ID 的 S
我意外删除了 Amazon SQS 中的队列。有没有办法检索/撤消删除? 最佳答案 不,队列(以及队列上的任何消息)将永远消失。 如果您使用相同名称重新创建队列,它将保留相同的 ARN 和 URL。希
我的大多数 Celery 任务的 ETA 都长于 Amazon SQS 定义的最大可见性超时。 celery documentation说: This causes problems with ETA
我正在实现 SQS fifo 队列。我必须使用 cloudformation 模板来实现。 当我放大推送时,我得到 错误API:sqs:CreateQueue 对资源 https://sqs.us-e
我有一个代码,我需要将消息发送到现有的 sqs 队列。 我在 aws-cdk 中有这段代码。但这是行不通的。没有添加访问权限。 const sqsQ = sqs.Queue.fromQueueArn(
我很想了解 GCP 的 PubSub 的实现。尽管 Pubsub 似乎指向遵循发布-订阅设计模式,但它似乎比 AWS SNS(使用发布-订阅模型)更接近 AWS 的 SQS(队列)。为什么认为这是,G
序言:我正在尝试为我认为是一个非常常见的用例提出一个建议,我想使用 Amazon 的 SWF 和 SQS 来实现我的目标。可能还有其他服务可以更好地匹配我正在尝试做的事情,因此,如果您有任何建议,请随
AWS SQS 是否可以通过某种方式调用我的 REST API?基本上,一旦消息被推送到 AWS SQS,我就想听到它并执行所需的操作。我可以安排一个每秒可以提取消息的监听器,但这不是一个优化解决方案
我已配置 SQS 监听器来使用消息列表中的消息,但一次只收到一条消息,并收到错误,因为无法将 model.StudentData 转换为 java.util.ArrayList 的实例 我的代码是:-
使用 Amazon Simple Queue Service 发送消息需要多长时间? 另外,我想知道在 Amazon SQS 中一分钟内会发送多少条消息? 最佳答案 截至 2007 年,at leas
我正在使用 Amazon-SQS,我尝试从队列中检索大约数量的属性,但响应为空 我正在使用 C# 以下是代码: GetQueueAttributesRequest attReq = new GetQu
我是一名优秀的程序员,十分优秀!