はじめに

本投稿ではAWSが用意しているAWS SDK for PHPを、Laravelのプロバイダーとして簡単に使用できるaws-sdk-php-laravelについて、いろいろなAWSサービスにアクセスする方法がわかりづらかったので、その方法について解説します。

前提条件

  • Laravelのプロジェクトを用意し、aws-sdk-php-laravelのREADMEに従ってプロジェクトからaws-sdk-php-laravelを使用できるようにしてください。
  • この解説ではLaravelはバージョン10.42.0、aws-sdk-php-laravelはバージョン3.10.0を使用しています。
  • aws-sdk-php-laravelでアクセスするサービスに対するアクセス権限をIAMユーザーやIAMロールに適宜付与してください。
  • AWSの各サービスへのアクセスはAWS SDK for PHPのドキュメントと、aws-cliのドキュメントをベースに書いています。

IAMユーザーとIAMロール

AWSのリソースへローカルやEC2などからアクセスする場合、基本的には認証情報としてIAMユーザーや、EC2などにアタッチされたIAMロールの権限を利用して行います。

aws-sdk-php-laravelの場合、READMEに従って設定を行うとconfig/aws.phpが用意され、認証情報として.envなどからAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYがデフォルト読み込まれるようになっています。

ただ、このままだとEC2などにアタッチされているIAMロールの権限が使用できないため、以下のようにconfig/aws.phpを修正することで対応できます。

<?php

use Aws\Laravel\AwsServiceProvider;

// ローカル環境の場合(IAMユーザーの権限を使用する場合)
// .envの「APP_ENV」を「local」にしています
if (config('app.env') == 'local') {
    return [
        'credentials' => [
            'key'    => env('AWS_ACCESS_KEY_ID', ''),
            'secret' => env('AWS_SECRET_ACCESS_KEY', ''),
        ],
        'region' => env('AWS_REGION', 'us-east-1'),
        'http' => [
            'proxy' => env('PROXY_URL', ''),
        ],
        'version' => 'latest',
        'ua_append' => [
            'L5MOD/' . AwsServiceProvider::VERSION,
        ],
    ];
} else {  // EC2などの場合(IAMロールの権限を使用する場合)
    return [
        // 'credentials'の項目を削除
        'region' => env('AWS_REGION', 'us-east-1'),
        'http' => [
            'proxy' => env('PROXY_URL', ''),
        ],
        'version' => 'latest',
        'ua_append' => [
            'L5MOD/' . AwsServiceProvider::VERSION,
        ],
    ];
}

上記の様に記載することで、環境毎に権限の参照先を分けられます。
また、.envでのリージョンの指定は「AWS_REGION」なので気をつけてください。

クライアントを作成する

aws-sdk-php-laravelを使用してAWSのサービスにアクセスするには、アクセスするサービス用のクライアントオブジェクトを作成します。
aws-sdk-php-laravelのREADMEに従って準備をした場合、以下のようにAWS(AWSFacade)からcreateClient()を使用してクライアントを作成します。

// S3のクライアントを作成する場合
$s3Client = \AWS::createClient('S3');

// AutoScalingのクライアントを作成する場合
$autoScalingClient = \AWS::createClient('AutoScaling');

createClinet()に渡すサービス名は全て小文字でもキャメルケースでもどちらでも問題ありません。(AutoScaling、autoScaling、autoscalingなど)

クライアントが作成できるサービスはこちらのNamespaces一覧を確認してください。

実際に使ってみる(S3編)

作成されたクライアントからコマンドに対応するメソッドを呼び出すことでアクセスできます。
S3のコマンドに対応するメソッドはドキュメントにまとまっています。(「Supported API Versions」を参照)

// S3用のクライアントを作成
$s3Client = \AWS::createClient('S3');

// バケット一覧を取得
$s3Client->listBuckets();

// バケット内の一覧を取得
$result = $s3Client->listObjects(['Bucket' => 'バケット名']);

実際に使ってみる(AutoScaling編)

AutoScalingなどの一部のサービスでは、コマンドに対応するメソッドが対象のサービスのドキュメントに記載されていないものがありますが、その場合はaws-cliの対象のサービスのドキュメントから対象のコマンドを探し、コマンドをアッパーキャメルケースに変更してAWS SDK for PHPのドキュメント上部の検索フィールドから検索をしてみてください。

例えば、AutoScalingGroupの一覧を取得するコマンドは「describe-auto-scaling-groups」なので、「DescribeAutoScalingGroups」として検索すれば対象のドキュメントがヒットします。

また、各コマンドのオプションについては、連想配列としてコマンド名のメソッドに渡す形になります。
先ほどのAutoScalingGroupの一覧を取得するコマンドで取得するグループ名を絞る場合は、オプションとして「–auto-scaling-group-names [value]」を使用しますが、まずはオプションをアッパーキャメルケースの形にし、[value]の情報としてグループ名を配列で渡します。

// AutoScaling用のクライアントを作成
$autoScalingClient = \AWS::createClient('utoScaling');

// オプションとして取得する取得するグループ名を絞る(実際のオプションは「--auto-scaling-group-names」)
$options = [
    'AutoScalingGroupNames' => [
        '「AutoScalingGroup A」',
        '「AutoScalingGroup B」',
    ],
];

// AutoScalingGroupの一覧情報を取得
$result = $autoScalingClient->describeAutoScalingGroups($options);

取得したデータ

各メソッドはレスポンスとしてAWS\Resultクラスのオブジェクトを返却します。
このオブジェクトの中身は使用したコマンドにより異なります。

例えば、S3からバケット内のオブジェクト一覧を所得した場合は、返却されたオブジェクトの「Contents」要素に配列で一覧のデータが入っていますが、AutoScalingから所得した場合は、「AutoScalingGroups」要素に配列として入っています。

AWSから返却されたデータの要素についてはAWS CLIのドキュメントを見てもらえれば記載されていますが、簡単に要素の内容を確認したいようでれば、 dd()などで要素をブラウザ上に表示してみるというのも1つの方法です。

// バケット内の一覧を取得
$result = $s3Client->listObjects(['Bucket' => 'バケット名']);
// $result['Contents']内に配列でデータが格納されている

// AutoScalingGroupの一覧情報を取得
$result = $autoScalingClient->describeAutoScalingGroups($options);
// $result['AutoScalingGroups']内に配列でデータが格納されている

最後に

aws-sdk-php-laravelはAWS SDK for PHPをLaravelから呼びやすくしただけなので、AWS SDK for PHPを使用したことがある場合は特に難しいことはありませんが、aws-sdk-php-laravelから使い始める場合はAWS SDK for PHPのルールを把握するコストがかかるので、この投稿で少しでもそのコストを抑えられれば幸いです。