Errore durante l'aggiunta di autorizzazioni a un argomento Amazon SNS quando si utilizzano le librerie .NET
-
27-09-2019 - |
Domanda
Quando si tenta di aggiungere le autorizzazioni a un argomento Amazon SNS utilizzando il AWS SDK per .NET /1.1 .0.1 utilizzando il codice simile al seguente:
AddPermissionRequest request = new AddPermissionRequest()
.WithActionNames(new[] { "Publish" })
.WithAWSAccountIds(new[] { "xxx" })
.WithLabel("PrincipleAllowControl")
.WithTopicArn(resourceName);
client.AddPermission(request);
viene restituito il seguente messaggio di errore:
<ErrorResponse xmlns=" http://sns.amazonaws.com/doc/2010-03-31/">
<Error>
<Type>Sender</Type>
<Code>ValidationError</Code>
<Message>2 validation errors detected: Value null at 'actionName' failed to satisfy constraint: Member must not be null; Value null at 'aWSAccountId' failed to satisfy constraint: Member must not be null</Message>
</Error>
<RequestId>45054159-e46b-11df-9b30-693941920fe7</RequestId>
</ErrorResponse>
Soluzione
Aggiorna - Questo è stato risolto nell'ultima versione delle API .NET in modo che chiunque continui a riscontrare questo problema dovrebbe eseguire l'aggiornamento alla 1.1.1 versione delle API.
Mi ha portato un po 'per capire cosa stava succedendo e ho finito per dover utilizzare la versione HTTP dei clienti, così come Wireshark a guardare cosa stava succedendo, ma sembra che ci sia un bug in AWS SDK per .NET / 1.1.0.1. Quando ho scritto una funzione simile utilizzando il AWS SDK per Java cose dimostrato di funzionare bene, il seguente è un piccolo blocco di tale codice:
AddPermissionRequest permissionRequest = new AddPermissionRequest()
.withActionNames("Publish")
.withAWSAccountIds("xxx")
.withLabel("PrincipleAllowControl")
.withTopicArn(resourceName);
client.addPermission(permissionRequest);
Guardando ciò che stava accadendo con Wireshark alzato il seguente, con alcuni minori censurare e modificare per chiarezza:
POST / HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=utf-8 User-Agent: AWS Java SDK-1.0.14 Host: sns.us-east-1.amazonaws.com Content-Length: 419 Action=AddPermission& SignatureMethod=HmacSHA256& Label=PrincipleAllowControl& ActionName.member.1=Publish& AWSAccessKeyId=xxx& Version=2010-03-31& AWSAccountId.member.1=xxx& SignatureVersion=2& TopicArn=arn%3Aaws%3Asns%3Aus-east-1%3A589983072084%3Axxx& Timestamp=2010-10-31T02%3A10%3A10.833Z& Signature=Bq09wa2vF1levQGcQZWVaix3UG7Mxlq2JCk4znEYHAM%3D POST / HTTP/1.1 User-Agent: AWS SDK for .NET/1.1.0.1 Content-Type: application/x-www-form-urlencoded; charset=utf-8 Host: sns.us-east-1.amazonaws.com Content-Length: 422 Action=AddPermission& TopicArn=arn%3Aaws%3Asns%3Aus-east-1%3A589983072084%3Axxx& Label=PrincipleAllowControl& AWSAccountIds.member.1=xxx& ActionNames.member.1=Publish& AWSAccessKeyId=xxx& SignatureVersion=2& SignatureMethod=HmacSHA256& Timestamp=2010-10-30T21%3A18%3A39.753Z& Version=2010-03-31& Signature=m9OvL1v91eurDa5QYP9gwrd2crdtssHsDFonFny3frU%3D
Come si può vedere, l'AWS SDK per .NET sta facendo una chiamata utilizzando AWSAccountIds e ActionNames al contrario di AWSAccountId e ActionName utilizzato dalla Java SDK AWS che spiega il messaggio di errore che è stato restituito.
Per il momento non sembra essere molto che si può fare su di esso a corto di non utilizzare il comando nelle applicazioni .NET e scrivere il proprio codice per effettuare la chiamata. Con tutta la fortuna che questo sarà fissato in un aggiornamento per l'SDK.