web-dev-qa-db-fra.com

Erreur "constante AWS non initialisée (NameError)"

Cela signifie qu'AWS n'est pas initialisé. J'utilise le joyau aws-sdk-core.

J'ai essayé d'utiliser le gem aws-sdk à la place, et le problème était toujours là.

Voici le fichier initializers/aws.rb:

AWS.config(:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
                      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'])

s3 = AWS::S3.new
AVATAR_BUCKET = s3.buckets[ENV['AVATAR_BUCKET_NAME']]

Lorsque j'essaie d'exécuter le serveur ou d'ouvrir la console, j'obtiens cette erreur:

/initializers/aws.rb:1:in '': constante AWS non initialisée (NameError)

38
bezzoon

Vous pouvez obtenir cette erreur, car vous n'avez pas défini la bonne version de aws sdk dans votre Gemfile. Cela peut se produire lors du regroupement d'anciennes applications avec la version 1 ou 2 installée.

Assurez-vous de la version que vous souhaitez installer:

aws-sdk version

gem 'aws-sdk', '~> 3'

# call sdk    
Aws.<whatever>

aws-sdk version 2

gem 'aws-sdk', '~> 2'

# call sdk    
Aws.<whatever>

aws-sdk version 1

# version constraint
gem 'aws-sdk', '< 2'

# or 

# use the v1 gem
gem 'aws-sdk-v1'

# call sdk    
AWS.<whatever>

v1 est délimité sous AWS et v2 et v3 délimité sous Aws => Cela vous permet d'exécuter v1 et v2 côte à côte.

11
Simon Franzen

Si vous recevez cette erreur et que vous avez installé la gem "aws-sdk", vous avez probablement mis à niveau involontairement vers la version 2 de la gem aws-sdk . La version 2 utilise l'espace de noms Aws, pas AWS. Cela permet d'utiliser la version 1 et la version 2 dans la même application.

Voir ceci article de blog pour plus d'informations.

111
Trevor Rowe

Vous devez installer/utiliser le -v1 version de aws-sdk. Faire simplement gem 'aws-sdk' ou require 'aws-sdk' peut utiliser la version 2.x de aws-sdk au lieu.

Pour éviter toute confusion , pour les scripts qui nécessitent 1.x, utilisez:

require 'aws-sdk-v1' # not 'aws-sdk'

Et pour les scripts qui nécessitent 2.x, utilisez:

gem 'aws-sdk', '~> 2'

comme l'indique documentation GitHub .

24
DrStrangepork

Il semble que la gemme ne soit pas présente dans votre chemin de chargement ou qu'elle ne soit pas requise.

L'entrée dans votre Gemfile doit être

gem 'aws-sdk'

Cela fera implicitement un require 'aws-sdk' lors de l'initialisation de l'application, tant que vous démarrez l'application avec bundle exec Rails server ou bundle exec Rails console.

Alternativement, si le code ci-dessus était dans une application non-Rails, placez simplement require 'aws-sdk' sur la première ligne.

6
Chris Aitchison

J'ai rencontré ce problème dans une recette de chef, donc la réponse ci-dessous est résolument centrée sur le chef.

Amazon a publié la version 2 de l'aws-sdk au début de février 2015. La version 2 n'est pas entièrement rétrocompatible avec la version 1.

Donc, vous devez prendre une décision - êtes-vous satisfait de la fonctionnalité de la version 1, ou voulez-vous la fonctionnalité de la version 2?

Si vous vous contentez de la version 1, peut-être à court terme, il est nécessaire que Chef charge explicitement la version 1, car par défaut, il semble utiliser la dernière version. Pour ce faire, vous devez spécifier l'attribut de version à charger dans la recette qui charge chef_gem aws-sdk. La modification ressemble à ceci (probablement implémentée dans un default.rb pour le livre de cuisine en question):

chef_gem "aws-sdk" do
  action :nothing

  # Source:  https://aws.Amazon.com/releasenotes/Ruby?browse=1
  version '1.62.0'  

end.run_action(:install)

Mettez à jour la version dans les métadonnées du livre de recettes, puis téléchargez le livre de recettes sur votre serveur Chef. Mettez à jour la version du livre de recettes dans l'environnement, puis téléchargez l'environnement sur votre serveur Chef.

Après la convergence, exécutez une liste de gemmes sur votre instance pour voir les versions des gemmes:

Sur PowerShell PS C:\Users\Administrator> gem list | select-string aws-sdk

Sous Linux: liste des gemmes | grep -i aws-sdk

Ce sont des résultats typiques:

aws-sdk (2.0.27, 1.62.0) 
aws-sdk-core (2.0.27) 
aws-sdk-resources (2.0.27) 
aws-sdk-v1 (1.62.0)

Notez que le dernier spécifie aws-sdk-v1. Maintenant, vous devez mettre à jour votre recette pour avoir besoin de l'ancienne version de aws-sdk. Change ça:

require 'aws-sdk'

pour ça:

require 'aws-sdk-v1'

Mettez à jour la version dans le metadata.rb, téléchargez le livre de recettes, mettez à jour la version dans le fichier d'environnement, téléchargez l'environnement, et vous devriez être prêt à aller après la prochaine convergence.

Ce billet de blog contient plus de détails et de solutions à ce problème: http://Ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

4
doer

J'étais confronté au même problème. Une réponse a fonctionné ici sans mettre à jour le gem.

Changez simplement où vous le souhaitez [in th require statement in environment]

require 'aws-sdk'

à

require 'aws-sdk-v1'
1
Zelocox

Je ne suis pas un expert Ruby, mais j'ai résolu le même problème en exécutant les commandes ci-dessous.

Pour supprimer les gemmes AWS installées

gem list --no-version --local | grep aws | xargs gem uninstall -aIx

Pour installer la gemme v1 qui était compatible avec mon script Ruby:

gem install aws-sdk -v 1.64.0

Je suis d'accord que ce n'est pas la méthode recommandée car AWS recommande d'utiliser la dernière version, mais cela devrait être utile pour quelqu'un qui ne souhaite pas modifier ses scripts existants.

1
vikas027