■AWS SDK(バージョン3)
AWS SDK for PHP | AWS
https://aws.amazon.com/jp/sdk-for-php/
「AWS SDK for PHP v3」を使ったS3へのアップロード・ダウンロード処理 | 株式会社ビヨンド
http://beyondjapan.com/blog/2017/04/%E3%80%8Caws-sdk-for-php-v3%E3%80%8D%E3%82%92%E4%BD%BF%E3%81%A3%...
2017/11/16時点で、この方法ならPHPからS3にアップロードできた。
■インストール
composer require aws/aws-sdk-php
■証明書エラー
phpからAWS S3にアクセスしようとしたときに「SSL certificate problem: unable to get local issuer certificate」となった場合の対応
https://www.scriptlife.jp/contents/programming/2017/09/18/php-curl-certificate-failed/
証明書エラーになったが、以下のように設定すれば解消した
C:\xampp\php\php.ini
curl.cainfo = "C:\Program Files\Git\etc\pki\ca-trust\extracted\openssl\ca-bundle.trust.crt"
■稼働中のEC2を取得する例
<?php
require_once 'vendor/autoload.php';
use Aws\Ec2\Ec2Client;
use Aws\Ec2\Exception\Ec2Exception;
try {
// アクセスキーとシークレットアクセスキーを指定して接続
$client = new Ec2Client([
'credentials' => [
'key' => 'XXXXX',
'secret' => 'YYYYY',
],
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
// インスタンスの情報を取得
$result = $client->describeInstances([
'Filters' => [
[
'Name' => 'instance-state-name',
'Values' => ['running'],
],
],
]);
// 結果を出力
foreach ($result['Reservations'] as $reservation) {
$instance = $reservation['Instances'][0];
echo 'InstanceId ... ' . $instance['InstanceId'] . '<br />';
echo 'PrivateIpAddress ... ' . $instance['PrivateIpAddress'] . '<br />';
echo '<hr />';
}
} catch (Ec2Exception $e) {
exit('Ec2Exception: ' . $e->getMessage());
} catch (Exception $e) {
exit('Exception: ' . $e->getMessage());
}
■S3のディレクトリを一覧する例
<?php
require_once 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
try {
// アクセスキーとシークレットアクセスキーを指定して接続
$client = new S3Client([
'credentials' => [
'key' => 'XXXXX',
'secret' => 'YYYYY',
],
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
// バケットとディレクトリを指定して取得
$result = $client->listObjects([
'Bucket' => 'ZZZZZ',
'Prefix' => 'blog/',
'Delimiter' => '/',
]);
// ディレクトリを表示
foreach ($result['CommonPrefixes'] as $prefix) {
echo $prefix['Prefix'] . '<br>';
}
} catch (S3Exception $e) {
exit('S3Exception: ' . $e->getMessage());
} catch (Exception $e) {
exit('Exception: ' . $e->getMessage());
}
■S3のファイルを一覧する例
<?php
require_once 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
try {
// アクセスキーとシークレットアクセスキーを指定して接続
$client = new S3Client([
'credentials' => [
'key' => 'XXXXX',
'secret' => 'YYYYY',
],
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
// バケットとディレクトリを指定して取得
$result = $client->listObjects([
'Bucket' => 'ZZZZZ',
'Prefix' => 'blog/photo/',
'Delimiter' => '/',
]);
// ファイルを表示
foreach ($result['Contents'] as $content) {
echo $content['Key'] . '(' . $content['LastModified'] . ')' . '<br>';
}
} catch (S3Exception $e) {
exit('S3Exception: ' . $e->getMessage());
} catch (Exception $e) {
exit('Exception: ' . $e->getMessage());
}
■S3のファイルを取得する例
<?php
require_once 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
try {
// アクセスキーとシークレットアクセスキーを指定して接続
$client = new S3Client([
'credentials' => [
'key' => 'XXXXX',
'secret' => 'YYYYY',
],
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
// バケットとファイルを指定して取得
$result = $client->getObject([
'Bucket' => 'ZZZZZ',
'Key' => 'images/photo01.jpg',
]);
// ファイルを表示
header('Content-Type: image/jpeg');
echo $result['Body'];
exit;
} catch (S3Exception $e) {
exit('S3Exception: ' . $e->getMessage());
} catch (Exception $e) {
exit('Exception: ' . $e->getMessage());
}
■S3にファイルを保存する例
<?php
require_once 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
try {
// アクセスキーとシークレットアクセスキーを指定して接続
$client = new S3Client([
'credentials' => [
'key' => 'XXXXX',
'secret' => 'YYYYY',
],
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
// バケットにファイルを保存
$result = $client->putObject(array(
'Bucket' => 'ZZZZZ',
'Key' => 'images/photo01.jpg',
'Body' => file_get_contents('img/image.jpg'),
));
exit;
} catch (S3Exception $e) {
exit('S3Exception: ' . $e->getMessage());
} catch (Exception $e) {
exit('Exception: ' . $e->getMessage());
}
■S3に認証なしでアクセス
※未検証
バケットの公開設定によっては、認証情報なしでアクセスできるみたい
AWS SDK (PHP) での認証なしの S3 へのアップロード - Qiita
https://qiita.com/mangano-ito/items/d368e3e46048e2139936
■CloudWatchLogsのデータを取得する例
<?php
/*
FilterLogEvents - Amazon CloudWatch Logs
https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_FilterLogEvents.html
「The start of the time range, expressed as the number of milliseconds after Jan 1, 1970 00:00:00 UTC. 」
↑時間の指定はUNIXタイムスタンプのミリ秒で行う
PHPを使って、CloudWatch Logsからデータを取得します。
https://gist.github.com/yusukemurayama/0d0a81cad039cc68964b
「filterPattern」の指定例がなかなか見つけられないが、上記では使われている
<?php
require_once '../libs/vendor/autoload.php';
use Aws\CloudWatchLogs\CloudWatchLogsClient;
use Aws\CloudWatchLogs\Exception\CloudWatchLogsException;
try {
$client = new CloudWatchLogsClient([
'credentials' => [
'key' => 'XXXXX',
'secret' => 'YYYYY',
],
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
$result = $client->filterLogEvents([
'logGroupName' => '/var/log/nginx/access.log',
'startTime' => (time() - 60 * 60) * 1000, // 開始時間(UNIXタイムスタンプのミリ秒)
'endTime' => time() * 1000, // 終了時間(UNIXタイムスタンプのミリ秒)
'filterPattern' => '[httprequest != "*.ico*" && httprequest != "*.xml*"]',
]);
foreach ($result->get('events') as $event) {
echo $event['message'];
echo '<hr>';
}
} catch (CloudWatchLogsException $e) {
exit('CloudWatchLogsException: ' . $e->getMessage());
} catch (Exception $e) {
exit('Exception: ' . $e->getMessage());
}
■認証情報の外部ファイル化
あらかじめ credentials.ini を作成して認証情報を記載しておくと、
[default]
aws_access_key_id=XXXXX
aws_secret_access_key=YYYYY
CredentialProviderを使用して、認証情報を読み込むことができる
<?php
require_once 'vendor/autoload.php';
use Aws\CloudWatchLogs\CloudWatchLogsClient;
use Aws\CloudWatchLogs\Exception\CloudWatchLogsException;
use Aws\Credentials\CredentialProvider;
try {
$ini = './credentials.ini';
$iniProvider = CredentialProvider::ini('default', $ini);
$iniProvider = CredentialProvider::memoize($iniProvider);
$client = new CloudWatchLogsClient([
'credentials' => $iniProvider,
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
また認証情報を ~/.aws/credential で管理していて「[default]」の定義を使用する場合、以下のように簡略化できる(未検証)
<?php
require_once 'vendor/autoload.php';
use Aws\CloudWatchLogs\CloudWatchLogsClient;
use Aws\CloudWatchLogs\Exception\CloudWatchLogsException;
use Aws\Credentials\CredentialProvider;
try {
$client = new CloudWatchLogsClient([
'credentials' => CredentialProvider::defaultProvider(),
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
[PHP]aws-sdkでS3にファイルをアップロードする | akamist blog
https://akamist.com/blog/archives/4426