web-dev-qa-db-ja.com

エラー「初期化されていない定数AWS(NameError)」

AWSが初期化されていないということです。私はaws-sdk-core gemを使用しています。

代わりにaws-sdk gemを使用してみましたが、問題はまだありました。

これは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']]

サーバーを実行するか、コンソールを開くと、次のエラーが表示されます。

/initializers/aws.rb:1:in `':初期化されていない定数AWS(NameError)

38
bezzoon

Gemfileで正しいaws SDKバージョンを定義しなかったため これは、バージョン1または2がインストールされた古いアプリを再バンドルしているときに発生する可能性があります。

インストールするバージョンを確認します。

aws-sdkバージョン

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

# call sdk    
Aws.<whatever>

aws-sdkバージョン2

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

# call sdk    
Aws.<whatever>

aws-sdkバージョン1

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

# or 

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

# call sdk    
AWS.<whatever>

v1はAWSの下にスコープされ、v2とv3はAwsの下にスコープされます=>これにより、v1とv2を並べて実行できます。

11
Simon Franzen

このエラーが発生し、「aws-sdk」gemがインストールされている場合、おそらくaws-sdk gemのバージョン2に意図せずにアップグレードされている可能性があります 。バージョン2は、Awsではなく、AWS名前空間を使用します。これにより、バージョン1とバージョン2を同じアプリケーションで使用できます。

詳細については、こちらをご覧ください ブログ投稿 .

111
Trevor Rowe

-v1aws-sdkバージョンをインストール/使用する必要があります。単にgem 'aws-sdk'またはrequire 'aws-sdk'を実行すると、代わりに2.xバージョンのaws-sdkを使用できます。

混乱を避けるため、1.xを必要とするスクリプトでは、次を使用します:

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

また、2.xを必要とするスクリプトの場合、次を使用します。

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

GitHubドキュメント が示すように。

24
DrStrangepork

ロードパスにgemが存在しないか、不要であるかのように聞こえます。

Gemfileのエントリは

gem 'aws-sdk'

これは暗黙的にrequire 'aws-sdk'でアプリケーションを起動する限り、アプリケーションの初期化時にbundle exec Rails serverまたはbundle exec Rails console

または、上記のコードがRails以外のアプリケーションにある場合は、require 'aws-sdk'最初の行。

6
Chris Aitchison

私はシェフのレシピでこの問題に遭遇したので、以下の応答は明らかにシェフ中心です。

Amazonは、2015年2月上旬にaws-sdkのバージョン2をリリースしました。バージョン2は、バージョン1との完全な下位互換性はありません。

それで、あなたは決断をしなければなりません-あなたはバージョン1の機能を備えたコンテンツですか、それともバージョン2の機能が欲しいですか

バージョン1に満足している場合、おそらく短期的には、バージョン1を明示的にロードする必要があります。デフォルトでは、最新バージョンを使用しているように見えるためです。これを行うには、chef_gem aws-sdkをロードするレシピでロードするバージョン属性を指定する必要があります。変更は次のようになります(おそらく、問題のクックブックのdefault.rbに実装されます)。

chef_gem "aws-sdk" do
  action :nothing

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

end.run_action(:install)

クックブックのメタデータのバージョンを更新してから、クックブックをChefサーバーにアップロードします。環境内のクックブックのバージョンを更新してから、環境をChefサーバーにアップロードします。

収束後、インスタンスでgemリストを実行して、gemバージョンを確認します。

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

Linuxの場合:gem list | grep -i aws-sdk

これらは典型的な結果です:

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)

最後のものはaws-sdk-v1を指定していることに注意してください。ここで、レシピを更新して、旧バージョンのaws-sdkを要求する必要があります。これを変更:

require 'aws-sdk'

これに:

require 'aws-sdk-v1'

Metadata.rbのバージョンを更新し、クックブックをアップロードし、環境ファイルのバージョンを更新し、環境をアップロードします。次のコンバージェンスの後、準備ができているはずです。

このブログ投稿には、この問題の詳細と解決策が含まれています。 http://Ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

4
doer

私は同じ問題に直面していました。ここでは、gemを更新せずに1つの答えが機能しました。

必要な場所を変更するだけで[in th require statement in environment]

require 'aws-sdk'

require 'aws-sdk-v1'
1
Zelocox

私はRubyエキスパートではありませんが、以下のコマンドを実行することで同じ問題を解決しました。

インストールされたAWS gemを削除するには

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

My Rubyスクリプトと互換性のあるv1 gemをインストールするには:

gem install aws-sdk -v 1.64.0

AWSが最新バージョンを使用することを推奨しているため、これは推奨される方法ではないことに同意しますが、既存のスクリプトを変更したくない人にとっては便利なはずです。

1
vikas027