PHPからaws-sdkを使ってS3にファイルをアップロードするスクリプトを作成する手順です
前提条件
今回のプログラムでは、ローカルに存在するhello.txt
を、S3のバケットaws-php-s3-test
へhello-sw.txt
の名前でアップロードします。
AWSにアクセスするための認証情報はプログラムにハードコーディングせず、credentials.ini
に保存することとします。
作業手順
S3にバケットを作成
まずはS3にアップロード先のバケットを作成します。今回はaws-php-s3-test
の名前でバケットを作成しました。
バケット作成時に聞かれる"このバケットのブロックパブリックアクセス設定"の選択肢は、"パブリックアクセスをすべてブロック"を選択しても大丈夫です。
aws-sdkをダウンロード
下記のコマンドでインストールします。
ついでに、PHPのバージョンもcomposerの依存関係に登録しておきます(任意)。requireした後にautoloadのファイルをダンプしておきます。
composer require aws/aws-sdk-php
# 下記は任意
composer require php
composer dumpautoload
すると、composer.json, composer.lockファイルと、vendorディレクトリが作成されます。
composer.jsonが以下のような形になっていることを確認します。(バージョンは実行したタイミング、環境に依存します)
{
"require": {
"aws/aws-sdk-php": "^3.179",
"php": "^8.0"
}
}
認証情報を作成
.aws/credentialsを参考に、以下のような形でcredentials.ini
ファイルを作成します。
クレデンシャルを持っていない場合は、aws consoleのIAMからユーザ作成します。作ったユーザにはS3にファイルをPutできる権限を付与しておきます。
AWSのIAMについて詳しくない場合、AdministratorAccess権限を付与したIAMユーザを一時的に作成すれば、全権限を付与できるためプログラム実行時の問題の切り分けが行いやすいです。
[default]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
アップロードするファイルを作成
適当な内容でhello.txt
を作成します。
hello world!!
PHPのプログラム
以下の内容でmain.php
を作成します。
<?php
require __DIR__ . '/../vendor/autoload.php';
use Aws\Credentials\CredentialProvider;
function main()
{
$ini = './credentials.ini';
$iniProvider = CredentialProvider::ini('default', $ini);
$iniProvider = CredentialProvider::memoize($iniProvider);
$srcFile = 'hello.txt';
$client = new Aws\S3\S3Client([
'region' => 'ap-northeast-1',
'version' => '2006-03-01',
'credentials' => $iniProvider
]);
$client->putObject([
'Bucket' => 'aws-php-s3-test',
'Key' => 'hello-s3.txt',
'SourceFile' => $srcFile,
'ContentType'=> mime_content_type($srcFile)
]);
}
main();
プログラムの実行
先程作ったphpプログラムを、php main.php
で実行します。
エラーが出なければaws consoleにアクセスし、先程作ったバケットにhello-s3.txt
の名前でファイルができていることを確認します。
その値
~/.aws/credentialの利用
AWSのクレデンシャル情報を~/.aws/credentialで管理しており、[default]の定義を利用する場合、下記のphpコードに簡略化できます。
参考: 認証情報プロバイダの使用
function main()
{
$srcFile = 'hello.txt';
$client = new Aws\S3\S3Client([
'region' => 'ap-northeast-1',
'version' => '2006-03-01',
'credentials' => CredentialProvider::defaultProvider(),
]);
$client->putObject([
'Bucket' => 'aws-php-s3-test',
'Key' => 'hello-s3.txt',
'SourceFile' => $srcFile,
'ContentType'=> mime_content_type($srcFile)
]);
}
main();