2 votes

DynamoDb SocketException : Une opération de socket a été tentée vers un réseau inaccessible

Je essaie de me connecter à DynamoDb en local exécuté avec docker : docker run -p 8000:8000 dwmkerr/dynamodb -sharedDb

Mais je continue à obtenir l'erreur mentionnée dans le titre.

Je peux valider que le serveur DynamoDb fonctionne et est accessible.

Je peux accéder à l'URL http://localhost:8000/shell/

J'ai même essayé d'utiliser un client nodejs https://github.com/aaronshaf/dynamodb-admin et j'ai réussi à créer des tables.

Cependant, c'est seulement le code dotnet qui ne fonctionne pas !

class Program
{
    static void Main(string[] args)
    {
        var clientConfig = new AmazonDynamoDBConfig()
        {
            UseHttp = true,
            LogMetrics = true,
            LogResponse = true,
            DisableLogging = false,
            ServiceURL = "http://localhost:8000"
        };

        var dynamoClient = new AmazonDynamoDBClient(clientConfig);

        //AWSSDK
        var request = new CreateTableRequest
        {
            TableName = "Todo",
            KeySchema = new List { new KeySchemaElement("Id", KeyType.HASH), },
            AttributeDefinitions = new List { new AttributeDefinition("Id", ScalarAttributeType.N), },
            ProvisionedThroughput = new ProvisionedThroughput
            {
                ReadCapacityUnits = 10,
                WriteCapacityUnits = 5,
            }
        };
        dynamoClient.CreateTableAsync(request).Wait();
    }
}

Voici la trace complète des erreurs :

Unhandled Exception: System.AggregateException: Une ou plusieurs erreurs se sont produites. (Une opération de socket a été tentée sur un réseau inaccessible) ---> System.Net.Http.HttpRequestException: Une opération de socket a été tentée sur un réseau inaccessible ---> System.Net.Sockets.SocketException: Une opération de socket a été tentée sur un réseau inaccessible
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
  // ... (il s'agit d'une troncature) 

Étonnamment, ça fonctionne bien sur Mac !

3voto

Douglas Drinka Points 56

Si vous remontez la pile un peu, vous verrez que cette exception n'est pas causée par la tentative du SDK de se connecter à DynamoDB, mais plutôt par l'URL des métadonnées de l'instance EC2 (http://169.254.169.254). Le client DynamoDB essaie de récupérer un rôle IAM à partir d'EC2, et lorsqu'il est exécuté en dehors d'EC2, il ne peut pas le faire.

Je vois cette exception apparaître à partir de la version 3.3.24.6 d'AWSSDK.Core, au lieu de l'exception beaucoup plus significative qui était auparavant lancée :

Amazon.Runtime.AmazonServiceException : Échec de la récupération des informations d'identification à partir du service de métadonnées de l'instance EC2.

Cependant, la cause principale de votre problème est que vous n'avez pas rendu les informations d'identification AWS disponibles pour le SDK. Ajoutez un profil par défaut dans AWS Explorer pour Visual Studio, ou créez un fichier d'informations d'identification, et vous devriez être opérationnel.

0voto

RemotecUk Points 2038

J'avais ce problème et il m'a fallu un certain temps pour le résoudre.

Cela est dû au fait de ne pas avoir les bonnes informations d'identification dans votre fichier d'informations d'identification AWS.

Dans mon cas, j'avais écrasé les informations d'identification [default] et le SDK ne pouvait pas s'authentifier correctement.

Une fois que j'ai corrigé cela, tout a recommencé à fonctionner.

J'utilise le paquet NuGet AWSSDK.Lambda version 3.3.102.46.

0voto

Serge Semenov Points 2621

Au lieu de créer un profil AWS, vous pouvez simplement spécifier des clés aléatoires:

var client = new AmazonDynamoDBClient(
    awsAccessKeyId: "test",
    awsSecretAccessKey: "test",
    clientConfig);

Cela contourne la vérification du profil, et les valeurs de la clé d'accès ne sont pas utilisées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X