当前位置: 首页 > 知识库问答 >
问题:

从一个帐户中的lambda向另一个帐户中的SQS发送消息

徐淳
2023-03-14

对于从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密钥。

共有2个答案

宋洲
2023-03-14

可以为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
  • 使用访问策略在帐户B(接收帐户)中创建SQS队列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"
    }
  ]
}
  • 在Account-A中创建AWS Lambda函数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 }

消息已成功接收:

从建明
2023-03-14

这取决于你打算怎么做。一种方法是:

  • 设置SQS Acc中的可分配角色,该角色可由不同帐户中的lambda函数承担

另一种方法是通过基于SQS资源的策略,该策略允许lambda角色向其提交消息。

 类似资料:
  • 我想发送消息到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