#aws-lambda #amazon-sqs #amazon-cloudwatch #aws-step-functions
#aws-lambda #amazon-sqs #amazon-cloudwatch #aws-step-функции
Вопрос:
У меня есть правило событий Cloudwatch, которое периодически вызывает AWS Lambda. Этот лямбда-код пытается извлечь сообщение из очереди AWS SQS с помощью метода ReceiveMessage SDK. Затем, если появляется сообщение, оно вызывает функцию AWS Step. Этот процесс работает при локальном вызове. Однако, когда Cloudwatch запускает его, я получаю сообщение об ошибке Client network socket disconnected before secure TLS connection was established
. Смотрите мой код ниже:
module.exports.triggerStepFunction = () => {
let sqs = new AWS.SQS({apiVersion: '2012-11-05'})
let params = {
QueueUrl: 'my_endpoint',
AttributeNames: [
'All'
],
MessageAttributeNames: [
'All'
],
MaxNumberOfMessages: 1,
ReceiveRequestAttemptId: Date.now().toString(),
VisibilityTimeout: 10,
WaitTimeSeconds: 6
}
sqs.receiveMessage(params, function(err, receiveMessageData) {
if (err) {
return err
} else {
return receiveMessageData
}
})
}
Что происходит и как мне это исправить?
Ответ №1:
Похоже, решение состояло в том, чтобы создать новую роль IAM с надлежащими разрешениями и прикрепить ее к lambda. Я использую бессерверный, поэтому я добавил следующее в свой serverless.yml
файл и прикрепил его к lambda:
resources:
Resources:
SQSLambdaRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: '/'
Policies:
- PolicyName: logs
PolicyDocument:
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: arn:aws:logs:*:*:*
- PolicyName: sqs
PolicyDocument:
Statement:
- Effect: Allow
Action:
- sqs:ReceiveMessage
- sqs:SendMessage
- sqs:DeleteMessage
Resource: <MY_SQS_RESOURCE_ARN>