代码之家  ›  专栏  ›  技术社区  ›  G. Dan

需要有关CloudFormation模板和AWS lambda的帮助,以便通过lambda将事件从SQS拉到S3

  •  0
  • G. Dan  · 技术社区  · 3 年前

    我是AWS CloudFormation的新手,我正在尝试从SQS队列捕获事件,并通过AWS lambda将它们放在S3存储桶中。事件的流程是 SNS-->SQS<——兰姆达-->S3桶 .

    我正在尝试使用cloudFormation模板实现上述流程。部署CloudFormation模板后,我收到以下错误消息。如果您能提供任何帮助,我们将不胜感激。非常感谢。

    • 11:51:56 2022-01-13 17:51:47930-信息-。。。
    • 11:52:53 2022-01-13 17:52:48511-错误-Stack myDemoApp显示回滚状态rollback_IN_PROGRESS。
    • 11:52:53 2022-01-13 17:52:48674-信息-在资源EventStreamLambda的myDemoApp堆栈中发现以下根本原因故障事件:
    • 11:52:53 2022-01-13 17:52:48674-信息-资源处理程序返回消息:“GetObject时出错。S3错误代码:NoSuchKey。”。 S3错误消息:指定的密钥不存在。(服务:Lambda,状态代码:400,请求) ID:5f2f9882-a863-4a58-90bd-7E0D0DF4D5,扩展请求ID:null)”(请求令牌:0a95acb4-a677-0a2d-d0bc-8b7487a858ad,句柄错误代码:InvalidRequest)
    • 11:52:53 2022-01-13 17:52:48674-信息-。。

    我的lambda函数是:

    import json
    import logging
    
    import boto3
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s: %(levelname)s: %(message)s')
    
    
    def lambda_handler(event, context):
        logger.info(f"lambda_handler -- event: {json.dumps(event)}")
    
        s3_bucket = boto3.resource("3")
    
        event_message = json.loads(event["Records"][0]["body"])
        s3_bucket.put_object(Bucket="S3DeployBucket", key="data.json",  Body=json.dumps(event_message))

    我完整的云信息模板是:

    {
      "AWSTemplateFormatVersion": "2010-09-09",
      "Description": "myDemoApp Resource Stack",
      "Mappings": {
    
      },
      "Parameters": {
        "S3DeployBucket": {
          "Default": "myDemoApp-deploy-bucket",
          "Description": "Bucket for deployment configs and artifacts for myDemoApp",
          "Type": "String"
        },
        "EnvName": {
          "Description": "Platform environment name for myDemoApp",
          "Type": "String"
        },
        "AuditRecordKeyArn": {
          "Description": "ARN for audit record key encryption for myDemoApp",
          "Type": "String"
        },
        "ParentVPCStack": {
          "Description": "The name of the stack containing the parent VPC for myDemoApp",
          "Type": "String"
        },
        "StackVersion": {
          "Description": "The version of this stack of myDemoApp",
          "Type": "String"
        },
        "EventLogFolderName": {
          "Type": "String",
          "Description": "folder name for the logs for the event stream of myDemoApp",
          "Default": "event_log_stream"
        },
        "EventLogPartitionKeys": {
          "Type": "String",
          "Description": "The partition keys that audit logs will write to S3. Use Hive-style naming conventions for automatic Athena/Glue comprehension.",
          "Default": "year=!{timestamp:yyyy}/month=!{timestamp:MM}/day=!{timestamp:dd}/hour=!{timestamp:HH}"
        },
        "AppEventSNSTopicArn": {
          "Description": "Events SNS Topic of myDemoApp",
          "Type": "String"
        },
        "ReportingEventsRetentionDays": {
          "Default": "2192",
          "Description": "The number of days to retain a record used for reporting.",
          "Type": "String"
        }
      },
      "Resources": {
        "AppEventSQSQueue": {
          "Type": "AWS::SQS::Queue"
        },
    
        "AppEventSnsSubscription": {
          "Type": "AWS::SNS::Subscription",
          "Properties": {
            "TopicArn": {
              "Ref": "AppEventSNSTopicArn"
            },
            "Endpoint": {
              "Fn::GetAtt": [
                "AppEventSQSQueue",
                "Arn"
              ]
            },
            "Protocol": "sqs"
          }
        },
    
        "S3DeployBucket": {
          "Type": "AWS::S3::Bucket",
          "DeletionPolicy": "Retain",
          "UpdateReplacePolicy": "Retain",
          "Properties": {
            "BucketEncryption": {
              "ServerSideEncryptionConfiguration": [
                {
                  "ServerSideEncryptionByDefault": {
                    "KMSMasterKeyID": {
                      "Ref": "AuditRecordKeyArn"
                    },
                    "SSEAlgorithm": "aws:kms"
                  }
                }
              ]
            },
            "VersioningConfiguration": {
              "Status": "Enabled"
            },
            "LifecycleConfiguration": {
              "Rules": [
                {
                  "ExpirationInDays": {
                    "Ref": "ReportingEventsRetentionDays"
                  },
                  "Status": "Enabled"
                }
              ]
            }
          }
        },
        "EventStreamLogGroup": {
          "Type": "AWS::Logs::LogGroup"
        },
        "EventLogStream": {
          "Type": "AWS::Logs::LogStream",
          "Properties": {
            "LogGroupName": {
              "Ref": "EventStreamLogGroup"
            }
          }
        },
        "EventStreamSubscriptionRole": {
          "Type": "AWS::IAM::Role",
          "Properties": {
            "AssumeRolePolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Principal": {
                    "Service": "sns.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
                }
              ]
            },
            "Policies": [
              {
                "PolicyName": "SNSSQSAccessPolicy",
                "PolicyDocument": {
                  "Version": "2012-10-17",
                  "Statement": {
                    "Action": [
                      "sqs:*"
                    ],
                    "Effect": "Allow",
                    "Resource": "*"
                  }
                }
              }
            ]
          }
        },
        "EventDeliveryRole": {
          "Type": "AWS::IAM::Role",
          "Properties": {
            "AssumeRolePolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Principal": {
                    "Service": "sqs.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole",
                  "Condition": {
                    "StringEquals": {
                      "sts:ExternalId": {
                        "Ref": "AWS::AccountId"
                      }
                    }
                  }
                }
              ]
            }
          }
        },
        "EventSqsQueuePolicy": {
          "Type": "AWS::SQS::QueuePolicy",
          "Properties": {
            "PolicyDocument": {
              "Version": "2012-10-17",
              "Id": "SqsQueuePolicy",
              "Statement": [
                {
                  "Sid": "Allow-SNS-SendMessage",
                  "Effect": "Allow",
                  "Principal": "*",
                  "Action": [
                    "sqs:SendMessage",
                    "sqs:ReceiveMessage"
                  ],
                  "Resource": {
                    "Fn::GetAtt": [
                      "EventStreamLambda",
                      "Arn"
                    ]
                  },
                  "Condition": {
                    "ArnEquals": {
                      "aws:SourceArn": {
                        "Ref": "EventSNSTopicArn"
                      }
                    }
                  }
                }
              ]
            },
            "Queues": [
              {
                "Ref": "EventSNSTopicArn"
              }
            ]
          }
        },
        "EventDeliveryPolicy": {
          "Type": "AWS::IAM::Policy",
          "Properties": {
            "PolicyName": "sqs_delivery_policy",
            "PolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": [
                    "s3:PutObject"
                  ],
                  "Resource": [
                    {
                      "Fn::GetAtt": [
                        "S3DeployBucket",
                        "Arn"
                      ]
                    },
                    {
                      "Fn::Join": [
                        "",
                        [
                          {
                            "Fn::GetAtt": [
                              "S3DeployBucket",
                              "Arn"
                            ]
                          },
                          "/*"
                        ]
                      ]
                    }
                  ]
                },
                {
                  "Effect": "Allow",
                  "Action": [
                    "logs:PutLogEvents"
                  ],
                  "Resource": {
                    "Fn::Sub": "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:${EventStreamLogGroup}:log-stream:${EventLogStreamLogStream}"
                  }
                },
                {
                  "Effect": "Allow",
                  "Action": [
                    "kms:Decrypt",
                    "kms:GenerateDataKey"
                  ],
                  "Resource": [
                    {
                      "Ref": "AuditRecordKeyArn"
                    }
                  ],
                  "Condition": {
                    "StringEquals": {
                      "kms:ViaService": {
                        "Fn::Join": [
                          "",
                          [
                            "s3.",
                            {
                              "Ref": "AWS::Region"
                            },
                            ".amazonaws.com"
                          ]
                        ]
                      }
                    },
                    "StringLike": {
                      "kms:EncryptionContext:aws:s3:arn": {
                        "Fn::Join": [
                          "",
                          [
                            {
                              "Fn::GetAtt": [
                                "S3DeployBucket",
                                "Arn"
                              ]
                            },
                            "/*"
                          ]
                        ]
                      }
                    }
                  }
                }
              ]
            },
            "Roles": [
              {
                "Ref": "EventDeliveryRole"
              }
            ]
          }
        },
        "EventStreamLambda": {
          "Type": "AWS::Lambda::Function",
          "Properties": {
            "Handler": "lambda_function.lambda_handler",
            "MemorySize": 128,
            "Runtime": "python3.8",
            "Timeout": 30,
            "FunctionName": "sqs_s3_pipeline_job",
            "Role": {
              "Fn::GetAtt": [
                "SQSLambdaExecutionRole",
                "Arn"
              ]
            },
            "Code": {
              "S3Bucket": {
                "Ref": "S3DeployBucket"
              },
              "S3Key": {
                "Ref": "S3DeployBucket"
              }
            },
            "TracingConfig": {
              "Mode": "Active"
            }
          }
        },
        "SQSLambdaExecutionRole": {
          "Type": "AWS::IAM::Role",
          "Properties": {
            "AssumeRolePolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Principal": {
                    "Service": [
                      "lambda.amazonaws.com"
                    ]
                  },
                  "Action": [
                    "sts:AssumeRole"
                  ]
                }
              ]
            },
            "Policies": [
              {
                "PolicyName": "StreamLambdaLogs",
                "PolicyDocument": {
                  "Version": "2012-10-17",
                  "Statement": [
                    {
                      "Effect": "Allow",
                      "Action": [
                        "logs:*"
                      ],
                      "Resource": "arn:aws:logs:*:*:*"
                    }
                  ]
                }
              },
              {
                "PolicyName": "SQSLambdaPolicy",
                "PolicyDocument": {
                  "Version": "2012-10-17",
                  "Statement": [
                    {
                      "Effect": "Allow",
                      "Action": [
                        "sqs:ReceiveMessage",
                        "sqs:DeleteMessage",
                        "sqs:GetQueueAttributes",
                        "sqs:ChangeMessageVisibility"
                      ],
                      "Resource":"*"
                    }
                  ]
                }
              }
            ]
          }
        }
      },
      "Outputs": {
        "VpcSubnet3ExportKey": {
          "Value": {
            "Fn::Sub": "${ParentVPCStack}-privateSubnet3"
          }
        }
      }
    }
    0 回复  |  直到 3 年前
        1
  •  0
  •   Marcin    3 年前

    SubscriptionRoleArn only 对于运动:

    此属性适用于 仅适用于Amazon Kinesis数据消防软管 传递流订阅。