对于从lambda跨帐户访问SQS,我需要允许附加到lambda的IAM角色具有SQS权限,还是允许IAM角色在SQS的访问策略中具有权限?(或者两者都做?)
更新:基本上,我已经按照下面一些答案中的建议设置了SQS访问策略。
我得到一份工作
AWS。简单服务。不存在队列
尝试向队列(
boto3.resource('sqs')发送内容时。队列(“某个队列url”)。send_message(**kwargs))`从lambda,我想知道是否需要显式地将权限添加到IAM角色本身以允许发送到队列。
在lambda(位于us-west-1)中发送给SQS的代码如下:
import boto3
from botocore.config import Config
def lambda_handler(event, context):
boto3.resource('sqs').Queue('https://sqs.us-east-1.amazonaws.com/sqs_accnt_num/name_of_sqs').send_message(MessageBody="SomeMessageJSONDUMP")
SQS访问政策如下:
{
"Version": "2012-10-17"
"Id": "SomeID",
"Statement" : [
{
"Sid": "somesid",
"Effect": "Allow",
"Principal": "*",
"Action": "SQS:SendMessage",
"Resource":"arn:aws:sqs:us-east-1:sqs_accnt_num:name_of_sqs",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:iam::lambda_accnt_num:role/name:"
}
}
},
{
"Sid": "somesid2",
"Effect": "Deny",
"Principal": "*",
"Action": "sqs:*",
"Resource": "*",
"Condition": {
"Bool": {
"aws:secureTransport": "false"
}
}
}
]}
更新:问题已解决:
看起来问题出在SQS访问策略中。出于某种原因,在我最初的政策中,当我进行条件检查时,比如:
"Sid": "somesid",
"Effect": "Allow",
"Principal": "*",
"Action": "SQS:SendMessage",
"Resource":"arn:aws:sqs:us-east-1:sqs_accnt_num:name_of_sqs",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:iam::lambda_accnt_num:role/name:"
}
}
然后,在尝试从lambda发送消息时,我仍然收到一个“拒绝访问”错误。但正如John Rotenstein在其回答中所建议的,我完全删除了条件
条款,并将iam角色arn直接置于委托人中,如下所示:
"Sid": "somesid2",
"Effect": "Allow",
"Principal": {
"AWS":"arn:aws:iam::lambda_accnt_num:role/name:"
},
"Action": "sqs:*",
"Resource": "arn:aws:sqs:us-east-1:sqs_accnt_num:name_of_sqs"
然后成功了!虽然问题已经解决了,但有人知道为什么我原来的政策(附带条件条款)不起作用吗?我认为这项政策本身没有任何问题。
约翰·罗滕斯坦(John Rotenstein)的回答中有一个小小的警告;对于从lambda进行的跨区域sqs访问,在创建sqs_资源时,必须添加region_name
字段来表示sqs所在的区域,如下所示:
boto3.resource('sqs', region_name='us-east-1')
此外,如果您在SQS中启用了加密,请确保您的lambda具有KMS权限,并且允许从lambda帐户访问SQS拥有的KMS密钥。
可以为Amazon SQS队列提供访问策略。
此策略允许您授予实体对队列的访问权限,包括来自其他AWS帐户的实体。
因此,您可以简单地编辑SQS队列上的访问策略,以允许AWS Lambda函数使用的IAM角色的ARN进行访问。
以下是Amazon SQS-Amazon简单队列服务中的身份和访问管理示例:
以下示例Amazon SQS策略授予AWS帐户111122223333发送到AWS帐户44445556666拥有的queue2和从中接收的权限。
{
"Version": "2012-10-17",
"Id": "UseCase1",
"Statement" : [{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": [
"111122223333"
]
},
"Action": [
"sqs:SendMessage",
"sqs:ReceiveMessage"
],
"Resource": "arn:aws:sqs:us-east-2:444455556666:queue2"
}]
}
您应该能够更改主体
以引用正在使用的特定IAM角色。
更新:为了再现您的情况,我做了以下工作:
Amazon SQSFullAccess
策略为帐户A(发送帐户)中的Lambda创建IAM角色角色A
Queue-B
:{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__owner_statement",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Account-B:root"
},
"Action": "SQS:*",
"Resource": "arn:aws:sqs:ap-southeast-2:Account-B:queue-b"
},
{
"Sid": "__sender_statement",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Account-A:role/role-a"
},
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:ap-southeast-2:Account-B:queue-b"
}
]
}
Lambda-A
,向队列-B
发送消息:import boto3
def lambda_handler(event, context):
sqs_resource = boto3.resource('sqs')
queue = sqs_resource.Queue('https://sqs.ap-southeast-2.amazonaws.com/Account-B/queue-b')
response = queue.send_message(MessageBody="SomeMessageJSONDUMP")
# Debug
print(response)
调试日志项为:
{“……”,“MeasGID”:“……”,“RealSeMeStudio”:{……,“……”,“HtpStasuScript代码”:200,“HoppEdAds':{ X-AMZN-Reavestd”:“……”,“日期”:“星期五,2021年7月30日23:25:40格林尼治”,“内容类型”:“文本/XML”,“内容长度”:“378”},“RejyTrime':0 }
消息已成功接收:
我想发送消息到SQS队列上的另一个帐户(俄亥俄州)从lambda在北弗吉尼亚帐户。我该如何实现这一点? 到目前为止我尝试过的事情: > 从北Virigina的lambda发送消息,收到以下错误: “errorMessage”:“调用SendMessage操作时发生错误(AWS.SimpleQueueService.NonExistentQueue):
我在AWS云服务中设置了一个项目。在那里我使用了EC2实例、AMI、弹性IP、互联网门路、NACL、路由表、安全组、自定义VPC、私有和公共子网、弹性负载平衡、自动伸缩、启动配置、KMS-key、Lambda、RDS Aurora实例、S3桶、简单电子邮件服务、简单队列服务、简单通知服务、云观察日志。现在我的客户要求将所有服务从现有的AWS帐户迁移到新的AWS帐户。
我有两个帐户和两个线程。1个线程将钱从1个帐户转到2个帐户,2个线程将钱从2个帐户转到1个帐户,当然前提是有足够的钱。我需要了解死锁情况,并解决死锁情况以确认安全转移。以下是我目前的想法: 账户.java 主类 传输线程.java 为了安全转移,我决定将存款和取款两种方法同步。但怀疑用方法运行实现。我有正确的实现吗?如果不是,解释和纠正将不胜感激。
我有2个AWS帐户。我试图复制文件从帐户1到帐户2在桶2在美国西部2地区。我有所有必要的IAM政策,相同的凭据适用于两个帐户。我使用python boto3库。 如图所示,复制函数在指向目标帐户2/us-west-2的客户端对象上执行。它是如何获取帐户1/us-east1中的源文件的?我应该提供作为复制函数的输入吗?
除公证人外,我们的Corda网络还有3个节点。图中显示了每个节点应执行的操作。 只有在这种情况下,我们才会遇到“需要将令牌从帐户持有人转移到乙方”的麻烦 流程代码: 我们需要在C方执行流程,实际持有人是账户持有人,新持有人是乙方。 使用此代码,将返回一个错误:net.corda.core.CordaRuntime 异常:java.lang.非法描述异常:未为以下事务参与者提供流会话:[O = B