Dynamo DBのデータを更新する際に、暗号化された属性transactionAmount
に保存式を使用しています。ただし、更新クエリがConditionalCheckFailedExceptionで失敗しています。データは、前述のhereと同じ方法で、Dynamodbの初期永続化中にクライアント側で暗号化されます。され、次のコード:DynamoDBの暗号化された属性に式を保存します。
データ転送オブジェクト:
public final class SampleDTO {
@DynamoDBHashKey(attributeName = CommonDynamoDBSchemaConstants.UNIQUE_KEY)
@Getter(onMethod = @__({ @DoNotTouch }))
private String uniqueKey;
@DynamoDBAttribute(attributeName = CommonDynamoDBSchemaConstants.EVENT_RUNNING_TIME_EPOCH)
@Getter(onMethod = @__({ @DoNotTouch }))
private Long eventRunningTimeInEpoch;
@DynamoDBAttribute(attributeName = CommonDynamoDBSchemaConstants.INSTRUMENT_TYPE)
@DynamoDBTypeConverted(converter = InstrumentTypeConverter.class)
@Getter(onMethod = @__({ @DoNotTouch }))
private InstrumentType instrumentType;
@DynamoDBAttribute(attributeName = CommonDynamoDBSchemaConstants.TRANSACTION_AMOUNT)
private String transactionAmount;
}
データアクセスコード:
// fetches data from dynamoDB based on unique key passed to it.
SampleDTO sampleDTO = getSampleDTO("testLedgerUniqueKey");
sampleDTO.setInstrumentType(InstrumentType.MACHINE);
DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
Map<String, ExpectedAttributeValue> expressionAttributeValues =
new HashMap<String, ExpectedAttributeValue>();
expressionAttributeValues.put(
CommonDynamoDBSchemaConstants.LEDGER_UNIQUE_KEY,
new ExpectedAttributeValue(true)
.withValue(new AttributeValue(sampleDTO.getLedgerUniqueKey())));
expressionAttributeValues.put(
CommonDynamoDBSchemaConstants.TRANSACTION_AMOUNT,
new ExpectedAttributeValue(true).withValue(
new AttributeValue(sampleDTO.getTransactionAmount())));
saveExpression.setExpected(expressionAttributeValues);
saveExpression.setConditionalOperator(ConditionalOperator.AND);
dynamoDBMapper.save(sampleDTO, saveExpression, null /*dynamoDBMapperConfig*/);
dynamoDBにレコードがあります。 'transactionAmount'でexpressionAttributeValueを削除すると、条件付き保存が成功します。唯一の問題は 'transactionAmount'が暗号化された値として存在することです。 AFAIK、dynamoDBMapperは私たちの暗号化/復号化を処理します。 –