2010-06-11 4 views
4

나는 Heroku에서 실행중인 레일 앱을 보유하고 있습니다.종이 클립 및 Amazon S3 문제

The AWS Access Key Id you provided does not exist in our records. 
: 나는 S3 내 백엔드로 설정하고 모든 나는 다음과 같은 오류가 S3에 밀어하려고 할 때를 제외하고 벌금을 작동하는 것 같군, 사용자 아바타에 대한 몇 가지 간단한 이미지 업로드 및 다른 것들에 대한 클립을 사용하고 있습니다

내 액세스 키와 비밀 키를 잘못 붙여 넣었을 때, 다시 시도했지만 여전히 운이 없다고 생각합니다. 어쩌면 그냥 버키 열쇠 였을까 생각했는데, 나는 그것을 비활성화하고 새로운 것을 생성했다. 아직도 운이 없다.

두 키의 경우 OS X에서 S3 브라우저 앱을 사용하고 각각에 연결하여 현재 버킷을보고 버킷을 추가/삭제할 수있었습니다. 내가 알아야 할게있어? ENV [ 'S3_KEY']과 ENV [ 'S3_SECRET는'] 내가 직접 그것을 내 키를 사용하여도 시도 Heroku가의 환경 변수는 다음과 같습니다 그래서

development: 
    bucket: (unique name) 
    access_key_id: ENV['S3_KEY'] 
    secret_access_key: ENV['S3_SECRET'] 

test: 
    bucket: (unique name) 
    access_key_id: ENV['S3_KEY'] 
    secret_access_key: ENV['S3_SECRET'] 

production: 
    bucket: (unique_name) 
    access_key_id: ENV['S3_KEY'] 
    secret_access_key: ENV['S3_SECRET'] 

has_attached_file :cover, 
    :styles => { 
     :thumb => "50x50" 
    }, 
    :storage => :s3, 
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
    :path => ":class/:id/:style/:filename" 

EDIT 주처럼 내 응용 프로그램의 S3와 클립 설정을 가지고 여전히 작동하지 않습니다.

참고 : 방금 (고유 한 이름) 비트를 추가했습니다. 실제로는 존재하지 않습니다. 또한 버킷 이름을 확인했지만, 지금까지는 그렇게까지 멀지 않았다고 생각합니다. 또한 내 영웅 환경 변수 설정이 올바르게되어 있고 장치에 설정되어 있습니다.

답변

3

양동이를 설정하지 않았습니다. s3.yml 파일에 있지만, 귀하는 has_attached_file 전화에서 그 값을 읽지 않습니다.

종이 클립 S3 워드 프로세서 : 는 http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3#s3_protocol-instance_method

또한, 당신은 Heroku가 함께 s3.yml 파일을 사용하지 말하고있다 사람들에주의를 지불해야합니다. 그것은 낭비이고 단지 당신에게 아무것도 사지 않는 추상화를 추가했습니다. 이미 ENV가 필요한 값으로 설정되어 있으므로 사용하십시오.

내가 Heroku에 s3.yml 파일을 푸시하지 않으려 고하기 전에이 작업을 수행했지만, 테스트 및 개발을 위해 하나를 사용하고 싶습니다. 이니셜 라이저에서이 같은 일을 할 수 있습니다

# If an s3.yml file exists, use the key, secret key, and bucket values from there. 
# Otherwise, pull them from the environment. 
if File.exists?("#{Rails.root}/config/s3.yml") 
    s3_config = YAML.load_file("#{Rails.root}/config/s3.yml") 
    S3[:key] = s3_config[Rails.env]['key'] 
    S3[:secret] = s3_config[Rails.env]['secret'] 
    S3[:bucket] = s3_config[Rails.env]['bucket'] 
else 
    S3[:key] = ENV['S3_KEY'] 
    S3[:secret] = ENV['S3_SECRET'] 
    S3[:bucket] = ENV['S3_BUCKET'] 
end 

을 그럼 당신은 모델에 종이 클립을 설정하는 경우,이 같은 값을 참조 :

... 
:s3_credentials => { 
    :access_key_id => S3[:key], 
    :secret_access_key => S3[:secret] 
}, 
:bucket => S3[:bucket] 

분명히, 이것은 당신이 할 것을 의미합니다 git 저장소에 s3.yml 파일을 갖고 싶지는 않습니다 (실제로는 어쨌든해서는 안됩니다).

+0

이것이 사실이지만 원래 게시물의 오류를 확인하십시오. 버킷이 아직 재생되지 않도록 access_key_id가 허용되지 않음을 나타냅니다. 그것은 어떤 이해가되지 않습니다 – x1a4

+0

하지만 (그들은 환경 변수를 있는데도) 내 액세스 키를 인라인 내가 T에 Heroku가의 조언을 다음과 같은 이유, 나도 몰라 ... 일을하지만이 작업 결국, 감사합니다! – Jimmy

+0

당신은 git ignore리스트에 s3.yml을 추가 할 수 없으므로 Heroku에 나타나지 않을 수 있습니까? – Kevin

1

s3 yaml 파일은 실제로 s3에 대한 인증 정보로 ENV['S3_KEY']ENV['S3_SECRET'] 문자열을 사용하고 있습니다. 그들은 루비 코드로 평가되지 않습니다.

적어도 실제 정보를 yaml 파일에 넣는 것 외에는 할 수있는 몇 가지가 있습니다. look into enabling ERB in your yaml configs 또는 yaml 파일은 사용자의 자격 증명에 전혀 사용하지 않을 수 있습니다. 왜냐하면 항상 모든 rails_envs에서 환경을 사용하기 때문에 yaml 파일은 쓸모없는 우회 경로의 추가 레이어 일뿐입니다.

+0

+1 여기 Heroku의 블로그에서 유용한 링크가 있습니다. http://blog.heroku.com/archives/2009/4/7/config-vars/ – Anurag

+0

정확히 내가하는 일이 – Jimmy

+0

@ 지미 그것은 당신이 아니에요. 하고있어. 당신은 yaml 파일에 ENV 파일을 두었습니다. * Ruby 코드 *로 취급되지 않습니다. Heroku 블로그 게시물의 예제는 ENV 평가를 물론 클래스 자체에 ENV 평가를 적용했으며, s3.yml 파일에서 각 환경에 대해 별도로 선언 할 필요가 없습니다. – x1a4

3

동일한 AWS::S3::InvalidAccessKeyId 오류가 계속 발생했으며 매우 유사한 s3.yml 파일이 있습니다. x1a4 권장, 내 yaml 파일에서 ERB를 사용하고 그것은 효과.여기에 지금의 모습입니다 :

# myapp/config/s3.yml 

development: &DEFAULTS 
    bucket: myapp_dev 
    access_key_id: <%= ENV['S3_KEY'] %> 
    secret_access_key: <%= ENV['S3_SECRET'] %> 

test: 
    <<: *DEFAULTS 
    bucket: myapp_test 

production: 
    <<: *DEFAULTS 
    bucket: myapp 

staging: 
    <<: *DEFAULTS 
    bucket: myapp_staging 

나는이 몇몇 사람에 대한 약간 너무 간접 수도 생각하지만 나에게 가장 깨끗한 구현처럼 보였다.

+0

당신은 나의 완전한 영웅입니다! – altuzar