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

如何授予向不同AWS帐户中的SQS队列发送消息的权限?

沈凯康
2023-03-14

我正在编写一个Python应用程序,它从帐户a提取数据并发送到帐户B中的SQS队列。执行lambda函数时,它返回以下错误:

"errorMessage":"调用SendMessage操作时发生错误(AccessDended):拒绝访问资源https://eu-central-1.queue.amazonaws.com/。",

如果我在同一个帐户中使用SQS队列,它就会工作。

我使用的是无服务器框架,我需要在跨帐户角色中使用ExternalId。

我做过的事:

在帐户A中(执行Lambda函数)

以下功能是使用无服务器框架部署的:

  TotalCollectorWeekToDate:
    handler: environment.total_wtd_summary_handler
    module: collectors
    memorySize: 128
    role: arn:aws:iam::<ACCOUNT_A>:role/FunctionsLambdaRole
    timeout: 30
    events:
      - schedule:
          rate: cron(0 7 * * ? *)
          enabled: true
    environment:
      COST_DATA_SQS_QUEUE_URL: https://sqs.eu-central-1.amazonaws.com/<ACCOUNT_B>/prod-analyser-queue

角色

Resources:
  FunctionsLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: FunctionsLambdaRole
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action: "sts:AssumeRole"
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
      Policies:
        - PolicyName: logs
          PolicyDocument:
            Statement:
              Effect: Allow
              Action:
                - "logs:CreateLogGroup"
                - "logs:CreateLogStream"
                - "logs:PutLogEvents"
              Resource: "arn:aws:logs:*:*:*"
        - PolicyName: lambda
          PolicyDocument:
            Statement:
              Effect: Allow
              Action:
                - "lambda:InvokeFunction"
              Resource: "*"
        - PolicyName: VPCAccess
          PolicyDocument:
            Statement:
              Effect: Allow
              Action:
                - "ec2:CreateNetworkInterface"
                - "ec2:DescribeNetworkInterfaces"
                - "ec2:DeleteNetworkInterface"
              Resource: "*"
        - PolicyName: CostExplorerAccess
          PolicyDocument:
            Statement:
              Effect: Allow
              Action:
                - "ce:*"
              Resource: "*"
        - PolicyName: AssumeCostAnalyserDelegatedAccessRole
          PolicyDocument:
            Statement:
              Effect: Allow
              Action:
                - "sts:AssumeRole"
              Resource: "arn:aws:iam::<ACCCOUNT-B>:role/DelegatedAccessRole"

在帐户B中(SQS队列所在)

角色

Resources:
  DelegatedAccessPolicy:
    Type: 'AWS::IAM::ManagedPolicy'
    Properties:
      ManagedPolicyName: DelegatedAccessPolicy
      Path: /
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - sqs:SendMessage
              - sqs:GetQueueAttributes
              - sqs:GetQueueUrl
              - sqs:ListQueues
            Resource: arn:aws:sqs:eu-central-1:<ACCCOUNT-B>:prod-analyser-queue
  DelegatedAccessRole:
    Type: AWS::IAM::Role
    DeletionPolicy: Delete
    Properties:
      RoleName: DelegatedAccessRole
      Path: "/"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              AWS: !Ref TrustedEntities
            Action: sts:AssumeRole
            Condition:
              StringEquals:
                sts:ExternalId: !Ref ExternalId
      ManagedPolicyArns:
        - { "Fn::GetAtt" : ["DelegatedAccessPolicy", "Arn"]}


SQS


  DataPushQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: prod-analyser-queue
      DelaySeconds: 5
      MaximumMessageSize: 262144
      MessageRetentionPeriod: 345600
      VisibilityTimeout: 600
  DataPushQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Statement:
        - Effect: Allow
          Principal:
            AWS: 
              - arn:aws:iam::<ACCCOUNT-B>:role/DelegatedAccessRole
          Action:
          - sqs:SendMessage
          - sqs:DeleteMessage
          - sqs:GetQueueAttributes
          - sqs:GetQueueUrl
          - sqs:ListQueues
          - sqs:ReceiveMessage
          - sqs:SetQueueAttributes
          Resource: { "Fn::GetAtt" : ["DataPushQueue", "Arn"]}
      Queues:
        - !Ref DataPushQueue

共有1个答案

韩明德
2023-03-14

最干净的方法不是在帐户B中创建IAM角色,而是:

  • 帐户A中的Lambda函数将消息直接发送到帐户B中的SQS队列
  • 帐户-A中的Lambda函数需要权限才能将发送消息用于帐户-B中的SQS队列
  • 帐户B中的SQS队列需要一个SQS策略,该策略允许帐户A中的Lambda函数进行访问

来自Amazon SQS策略的基本示例:

以下示例策略为美国东部(俄亥俄州)地区名为445556666/queue1的队列授予AWS帐号111122223333SendMessage权限:

{
   "Version": "2012-10-17",
   "Id": "Queue1_Policy_UUID",
   "Statement": [{
      "Sid":"Queue1_SendMessage",
      "Effect": "Allow",
      "Principal": {
         "AWS": [ 
            "111122223333"
         ]
      },
      "Action": "sqs:SendMessage",
      "Resource": "arn:aws:sqs:us-east-2:444455556666:queue1"
   }]  
}

这比承担一个角色要容易得多。

 类似资料:
  • 我想发送消息到SQS队列上的另一个帐户(俄亥俄州)从lambda在北弗吉尼亚帐户。我该如何实现这一点? 到目前为止我尝试过的事情: > 从北Virigina的lambda发送消息,收到以下错误: “errorMessage”:“调用SendMessage操作时发生错误(AWS.SimpleQueueService.NonExistentQueue):

  • 我有50KAWS Lambda实例同时运行,它们都向SQS FIFO队列发送消息。 我想知道每秒可以发送到SQS FIFO队列的最大消息数是多少? 我在AWS文档中找不到这样的信息。

  • 对于从lambda跨帐户访问SQS,我需要允许附加到lambda的IAM角色具有SQS权限,还是允许IAM角色在SQS的访问策略中具有权限?(或者两者都做?) 更新:基本上,我已经按照下面一些答案中的建议设置了SQS访问策略。 我得到一份工作 尝试向队列boto3.resource('sqs')发送内容时。队列(“某个队列url”)。send_message(**kwargs))`从lambda,

  • 我有一个不断运行的lambda函数和一些动态创建的SQS队列。我需要一种允许lambda访问所有SQS队列的方法,以便可以使用这些动态创建的队列-我如何做到这一点? 目前,我使用的执行角色具有iam策略和单个队列ARN,但似乎无法创建多个执行角色。

  • 我不知道如何(或者在哪里)从AWS向用户授予读写权限,这样用户就可以在生产环境中的sample_app上发布图片。这是第11章的最后一个任务,它没有被教程覆盖,我在任何地方都找不到解决方案。 这是文件: 这是教程中的过程: 1)创建AWS IAM用户并记录访问和密钥-完成 2) 创建S3 bucket-完成 3) 向在上一步中创建的用户授予读写权限-如何授予??? 4) 然后运行以下三个命令: 5

  • 文档建议将服务帐户添加到GApps的第三方oauth访问列表必须由域管理员手动完成:https://developers.google.com/drive/delegation#delegate_domain-wide_authority_to_your_service_account 有没有一种方法可以通过身份验证页面来实现这一点?