メモ > サーバ > サービス: AWS > AWS SDK(バージョン3)
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());
}
■セキュリティグループを一覧する例
<?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->describeSecurityGroups();
// 結果を出力
foreach ($result['SecurityGroups'] as $group) {
echo 'GroupId: ' . $group['GroupId'] . '<br />';
echo 'GroupName: ' . $group['GroupName'] . '<br />';
echo 'Description: ' . $group['Description'] . '<br />';
echo 'VpcId: ' . ($group['VpcId'] ?? 'N/A') . '<br />';
echo '<hr />';
}
} catch (Ec2Exception $e) {
exit('Ec2Exception: ' . $e->getMessage());
} catch (Exception $e) {
exit('Exception: ' . $e->getMessage());
}
■セキュリティグループの詳細を表示する例
<?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',
]);
$groupId = 'sg-0123456789';
// セキュリティグループの詳細を取得
$result = $client->describeSecurityGroups([
'GroupIds' => [$groupId],
]);
$securityGroup = $result['SecurityGroups'][0];
echo '<h3>セキュリティグループ情報</h3>';
echo 'GroupId: ' . $securityGroup['GroupId'] . '<br />';
echo 'GroupName: ' . $securityGroup['GroupName'] . '<br />';
echo 'Description: ' . $securityGroup['Description'] . '<br />';
echo 'VpcId: ' . ($securityGroup['VpcId'] ?? 'N/A') . '<br />';
echo '<hr />';
echo '<h3>インバウンドルール一覧</h3>';
foreach ($securityGroup['IpPermissions'] as $permission) {
$protocol = $permission['IpProtocol'];
$fromPort = $permission['FromPort'] ?? 'All';
$toPort = $permission['ToPort'] ?? 'All';
echo 'Protocol: ' . $protocol . '<br />';
echo 'Port Range: ' . $fromPort . ' - ' . $toPort . '<br />';
// IPv4 CIDR ブロック
if (!empty($permission['IpRanges'])) {
foreach ($permission['IpRanges'] as $range) {
echo 'CIDR: ' . $range['CidrIp'];
if (isset($range['Description'])) {
echo '(' . $range['Description'] . ')';
}
echo '<br />';
}
}
// IPv6 CIDR ブロック
if (!empty($permission['Ipv6Ranges'])) {
foreach ($permission['Ipv6Ranges'] as $range) {
echo 'CIDR (IPv6): ' . $range['CidrIpv6'];
if (isset($range['Description'])) {
echo '(' . $range['Description'] . ')';
}
echo '<br />';
}
}
// 他のセキュリティグループを参照している場合
if (!empty($permission['UserIdGroupPairs'])) {
foreach ($permission['UserIdGroupPairs'] as $pair) {
echo 'Referenced GroupId: ' . $pair['GroupId'];
if (isset($pair['Description'])) {
echo '(' . $pair['Description'] . ')';
}
echo '<br />';
}
}
echo '<hr />';
}
} catch (Ec2Exception $e) {
exit('Ec2Exception: ' . $e->getMessage());
} catch (Exception $e) {
exit('Exception: ' . $e->getMessage());
}
■セキュリティグループのIPアドレスを編集する例
説明に「test」と書かれたルールのIPアドレスを、一括で編集している。
正確には、対象のルールを削除し、改めて登録し直している。
ルールを削除するとき、一意なIDだけを指定して削除することはできない。プロトコルやポートなどが完全一致するものが対象となる。
<?php
require_once 'vendor/autoload.php';
use Aws\Ec2\Ec2Client;
use Aws\Ec2\Exception\Ec2Exception;
$groupId = 'sg-0123456789';
$targetDescription = 'test';
$newCidrIp = '203.0.113.1/32';
try {
// アクセスキーとシークレットアクセスキーを指定して接続
$client = new Ec2Client([
'credentials' => [
'key' => 'XXXXX',
'secret' => 'YYYYY',
],
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
// 現在のセキュリティグループ設定を取得
$result = $client->describeSecurityGroups([
'GroupIds' => [$groupId],
]);
$securityGroup = $result['SecurityGroups'][0];
foreach ($securityGroup['IpPermissions'] as $permission) {
$protocol = $permission['IpProtocol'];
$fromPort = $permission['FromPort'] ?? null;
$toPort = $permission['ToPort'] ?? null;
// 説明が "test" の IPv4ルールを探す
foreach ($permission['IpRanges'] as $range) {
if (isset($range['Description']) && $range['Description'] === $targetDescription) {
$oldCidr = $range['CidrIp'];
// 古いルールを削除
$client->revokeSecurityGroupIngress([
'GroupId' => $groupId,
'IpPermissions' => [[
'IpProtocol' => $protocol,
'FromPort' => $fromPort,
'ToPort' => $toPort,
'IpRanges' => [[
'CidrIp' => $oldCidr,
'Description' => $targetDescription,
]],
]],
]);
// 新しいCIDRでルールを追加
$client->authorizeSecurityGroupIngress([
'GroupId' => $groupId,
'IpPermissions' => [[
'IpProtocol' => $protocol,
'FromPort' => $fromPort,
'ToPort' => $toPort,
'IpRanges' => [[
'CidrIp' => $newCidrIp,
'Description' => $targetDescription,
]],
]],
]);
echo "ルールを {$oldCidr} から {$newCidrIp} に更新しました。<br />";
}
}
}
} 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