36

Tôi đang cố gắng gửi tin nhắn SMS SNS tới android thông qua api web. Downloaded và cài đặt SDK từ http://aws.amazon.com/developers/getting-started/php/AWS SDK cho PHP: Lỗi khi truy xuất thông tin xác thực từ máy chủ siêu dữ liệu tiểu sử mẫu

Got lỗi sau khi chạy sample.php:

Fatal error: Uncaught exception 'Aws\Common\Exception\InstanceProfileCredentialsException' with message 'Error retrieving credentials from the instance profile metadata server. When you are not running inside of Amazon EC2, you must provide your AWS access key ID and secret access key in the "key" and "secret" options when creating a client or provide an instantiated Aws\Common\Credentials\CredentialsInterface object. ([curl] 28: Connection timed out after 5016 milliseconds [url] http://169.254.169.254/latest/meta-data/iam/security-credentials/)' in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php:85 Stack trace: #0 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\RefreshableInstanceProfileCredentials.php(52): Aws\Common\InstanceMetadata\InstanceMetadataClient->getInstanceProfileCredentials() #1 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\AbstractRefreshableCredentials.php(54): Aws\Common\Credentials\Refreshable in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php on line 85 

Một chút hướng dẫn về chủ đề này sẽ giúp tôi rất nhiều

+0

Điều này có nghĩa rằng bạn đã không được cấu hình thông tin của bạn một cách chính xác. Vui lòng xem [Cung cấp thông tin xác thực cho SDK] (http://docs.aws.amazon.com/aws-sdk-php/guide/latest/credentials.html) từ SDK AWS cho Hướng dẫn sử dụng PHP. –

+0

Tôi đã định cấu hình tệp /.aws/credentials với AWS_ACCESS_KEY_ID và AWS_SECRET_ACCESS_KEY như đã đề cập ở đây. Tuy nhiên nó không hoạt động – Ravindra

+0

@Ravindra Bạn đã bao giờ tìm thấy một giải pháp? Tôi gặp vấn đề tương tự –

Trả lời

7

Bạn phải đặt các tập tin .aws/credentials với cấu hình của bạn trong thư mục chính của dịch vụ web * thường là /var/www) không có trong thư mục chính của người dùng đã đăng nhập.

Bạn có thể tìm thấy thư mục chính mà dịch vụ web của bạn đang sử dụng bằng cách chạy echo getenv('HOME'); trong tệp php trên máy chủ của bạn.

116

Trong trường hợp của tôi, tôi đã sử dụng

return DynamoDbClient::factory(array(
    'version' => 'latest', 
    'region' => AWS_REGION, 
    'key' => AWS_KEY, 
    'secret' => AWS_SECRET 
)); 

đó từng là ok với aws/aws-sdk-php phiên bản 2.8.5, nhưng khi nhà soạn nhạc tự động cài đặt phiên bản 3.2.0, tôi đã nhận lỗi trên. Vấn đề đơn giản là tôi nên thay đổi cách tôi thực hiện cuộc gọi đến

return DynamoDbClient::factory(array(
    'version' => 'latest', 
    'region' => AWS_REGION, 
    'credentials' => array(
    'key' => AWS_KEY, 
    'secret' => AWS_SECRET, 
) 
)); 

như được ghi lại here. Nếu không thay đổi cuộc gọi, php apache đã giảm trở lại để tìm kiếm tệp ~/.aws/credentials bằng biến môi trường HOME, bị trống. Bạn có thể kiểm tra giá trị của nó bằng cách chạy php -r 'var_dump(getenv("HOME"));'.

This là một bài liên quan

+6

Điều này đã cứu tôi một nhức đầu rất lớn. – vcardillo

+1

Đây là vấn đề của tôi. – jbolter

+1

thx, bạn đã tiết kiệm cho tôi rất nhiều thời gian – Dmitry

3

Tôi đã cố gắng sử dụng nộp chứng chỉ và có những lỗi tương tự, this guy trên github khá nhiều đóng đinh nó:

Các tập tin thông tin phải ở định dạng ini nhưng không có phần mở rộng .ini. Nó cần phải có một 'mặc định' phần định nghĩa với trọng và bí mật của bạn:

$ less ~/.aws/credentials 

[default] 
aws_access_key_id = key 
aws_secret_access_key = secret 

Nếu bạn chỉ định tên phần khác thay vì mặc định, chỉ cần thêm một chìa khóa profile các thông số S3Client:

[example] 
aws_access_key_id = key 
aws_secret_access_key = secret 

$s3Client = new \Aws\S3\S3Client([ 
    'version' => '2006-03-01', 
    'region' => $yourPreferredRegion, 
    'profile' => 'example', 
]); 

Sử dụng tệp thông tin xác thực hoặc biến môi trường là cách được khuyến nghị để cung cấp bằng chứng xác thực trên máy chủ của riêng bạn

Và câu trả lời của @Anti cũng giúp tôi rất nhiều!

Nếu bạn thích cách mã hóa cứng, chỉ cần làm theo câu trả lời của @shadi.

4

Sau đây là các bước sau:

  1. Loại cd ~ Bằng cách này, bạn sẽ đi vào thư mục home.
  2. mkdir .aws
  3. sudo vi .aws/credentials
  4. Viết dòng sau và lưu các tập tin.

    [default] 
    aws_access_key_id = Your AWS Access Key 
    
    aws_secret_access_key = Your AWS Secret Access Key 
    
+1

Điều này thật tuyệt vời nếu bạn đang cố gắng sử dụng SDK AWS trong tập lệnh dòng lệnh . – apokryfos

0

Trong trường hợp của tôi, tôi đã phải sử dụng mã hóa cứng credentials

$s3Client = new S3Client([ 
    'region' => REGION, 
    'version' => '2006-03-01', 
    'credentials' => [ 
     'key' => S3_KEY, 
     'secret' => S3_SECRETE, 
    ], 
]); 

Xem thêm chi tiết here:

Các vấn đề liên quan