こんぶにのブログ

エンジニアという職業を通して学んだことを発信するブログです。

phpのSDKを使ってAWS S3を操作してみた。

開発用EC2インスタンスから、SDKを使ってS3を操作したかった。
公式のチュートリアルを読んで、前提条件とか認証のところは関係なさそうだったのでスキップ。
インストールのところから読んで、composerを使ってインストール。
自分はCakeの中でやってたので、requireとかはいらなかった。
で、チュートリアルにある通りにソースを書いて、 cakeの中でcomponentファイルを作り、そこに張り付け。

<?php
declare(strict_types=1);

namespace App\Controller\Component;

use Cake\Controller\Component;
use Cake\Controller\ComponentRegistry;
use Aws\S3\S3Client;  
use Aws\Exception\AwsException;

/**
 * S3 component
 */
class S3Component extends Component
{
    /**
     * Default configuration.
     *
     * @var array<string, mixed>
     */
    protected $_defaultConfig = [];

    /**
     * List your Amazon S3 buckets.
     *
     * This code expects that you have AWS credentials set up per:
     * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
     */
    function listingAllBuckets() : void
    {
        //Create a S3Client 
        $s3Client = new S3Client([
            'profile' => 'default',
            'region' => 'us-west-2',
            'version' => '2006-03-01'
        ]);

        //Listing all S3 Bucket
        $buckets = $s3Client->listBuckets();
        foreach ($buckets['Buckets'] as $bucket) {
            echo $bucket['Name'] . "\n";
        }
    }
    

}

別コントローラでcomponent呼び出して利用できるように、上記を関数化などしてみた。
で、いざcontrollerで呼び出してみると、こんなメッセージ。

Cannot read credentials from home/nginx実行ユーザ/.aws/credentials

これは当然、認証情報がないからどこのアカウントのどこにアクセスするの?って感じで仕方ないと思う。
他の人のやり方とか見てると、.envに認証情報を記載していたりして。
でもそれをどこで読み込むんだ?とかそういうのがなくて。
多分それはローカルでのやり方で、自分はEC2を使っているから、違うんだろうという結論に達した。
上記エラーはAWS CLIでの認証のもの?っぽい。
そのディレクトリに認証用のファイルがないよ~ってことだと思われた。
以下を参考にaws configureを実行。
AWS CLIの認証設定をする際の注意 #aws-cli - Qiita

すると、アクセスキーやらを入力する画面が!!

アクセスキー発行

さて、アクセスキーを発行しよう。
認証に使いたいユーザでログインして、このセキュリティ認証情報ってところ。
アクセスキーを作成。
で、用途は何ですか?って聞かれるけど、適当に押して下の方の次へを押す。
そうすると、アクセスキーを発行できる。

CLI

さっき発行したのをコマンドで入力。

画面

S3にはこんなバケットを作っていた。

listBucketsを実行したところ・・・

できた!!!!! 感動。

感想

実行時にSDKが認証ファイルを探すんだろうけど、その場所さえ把握していればなんてことなく利用できるなと思った。
これがローカルだとどの場所を求められるんだろう?