Как взаимодействовать с зашифрованной очередью SQS? Доступ к ключу KMS не работает - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь взаимодействовать с зашифрованной очередью 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

В свете этого мне кажется, что:

  1. Ключ явно существует
  2. Это в нужном регионе
  3. Я даю ему доступ (или пытаюсь)

Так что мне интересно, есть ли что-то еще, что я пропускаю. Ключ должен быть отправлен как часть запроса? Что-то в том смысле, что я даю к нему неправильный доступ?

Любые советы приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...