Я пытаюсь взаимодействовать с зашифрованной очередью SQS через Java SDK.
Приложение отправляет ответ:
AmazonSQSException: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.
Однако я вижу, что ключ существует, и я пытаюсь предоставить надлежащий доступ.
Я предполагаю, что в том, как я это сделал, есть какая-то ошибка. Пожалуйста, смотрите ниже -
SDK Взаимодействие
Намерение: чтение из одной очереди и запись в другую. Сбой после строки 4 при попытке получения сообщений.
public void replayQueue(QueuePair queuePair) {
ReceiveMessageRequest messageRequest = new ReceiveMessageRequest()
.withQueueUrl(queuePair.getDlq());
log.info("Constructed receive request: " + messageRequest.toString());
sqs.receiveMessage(messageRequest).getMessages().stream()
.forEach(message -> {
log.info("Inside stream. Message: " + message.toString());
SendMessageRequest request = new SendMessageRequest()
.withQueueUrl(queuePair.getSource())
.withMessageBody(message.getBody());
log.info("Send request: " + request);
SendMessageResult result = sqs.sendMessage(request);
log.info("Sent messages to " + queuePair.getSource() + " with result of: " + result.toString());
}
);
}
Создание ключа
Ключ создается в шаблоне другого микросервиса и отлично работает для этого сервиса.
ApplicationKmsKeyForSqs:
Type: AWS::KMS::Key
Properties:
Description: Encrypts messages published to SQS from SNS
KeyPolicy:
Version: 2012-10-17
Id: !Sub ${DNSEndPoint}-application-${Environment}-sqs-kms-key
Statement:
- Sid: Enable IAM User Permission
Effect: Allow
Principal:
AWS: !Sub 'arn:aws:iam::${AWS::AccountId}:root'
Action:
- kms:*
Resource: '*'
- Sid: Allow SQS to use the key
Effect: Allow
Principal:
Service: sqs.amazonaws.com
Action:
- kms:GenerateDataKey*
- kms:Decrypt
Resource: '*'
ApplicationKMSKeyAlias:
Type: AWS::KMS::Alias
Properties:
AliasName: !Sub 'alias/application-${Environment}-sqs-kms-key'
TargetKeyId: !Ref ApplicationKmsKeyForSqs
Я вижу, что ключ существует в консоли AWS и имеет правильный псевдоним.
Предоставление разрешений для приложения
Эта политика должна давать моему приложению разрешения на использование ключа, созданного в другом микросервисе.
ApplicationPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: app-policy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- sqs:*
Resource: !Sub arn:aws:sqs:${AWS::Region}:${AWS::AccountId}:*${Environment}*
- Effect: Allow
Action:
- kms:Encrypt
- kms:Decrypt
- kms:GenerateDataKey*
- kms:*
Resource: !Sub arn:aws:kms:us-east-1:${AWS::AccountId}:alias/application-${Environment}-sqs-kms-key
В свете этого мне кажется, что:
- Ключ явно существует
- Это в нужном регионе
- Я даю ему доступ (или пытаюсь)
Так что мне интересно, есть ли что-то еще, что я пропускаю. Ключ должен быть отправлен как часть запроса? Что-то в том смысле, что я даю к нему неправильный доступ?
Любые советы приветствуются.