12.Amazon AWS S3に画像ファイルを保管

前へ 目次 次へ

Raspberry Pi から Amazon AWS S3 に画像ファイル、DynamoDB に保管場所と条件を記録するPHPプログラムを作成します。

先の距離センサプログラム /home/pi/pgm/awsphp/distance で、撮影した画像 /var/www/distance.jpg を S3 にアップし、DynamoDB に距離と保管時間、S3 のパスを記録します。
距離センサプログラムで画像保管後、このプログラムを実行すると一連の作業を自動化できます。

$ nano /home/pi/pgm/awsphp/ImageUp.php

 

</code>
#!/usr/bin/php
<?php
// SDK読込み
require_once('/home/pi/aws/vendor/autoload.php');

use Aws\Common\Aws;
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
use Aws\Sqs\SqsClient;
use Aws\Sqs\Exception\SqsException;
use Aws\Common\Enum\Region;
use Guzzle\Http\EntityBody;

// 距離
$distance = "0";
if(isset($argv[1])) $distance = $argv[1];

// 現在日時取得
$now        = new DateTime();
$datetime   = $now->format('Y/m/d H:i:s');
$y          = $now->format('Y');
$m          = $now->format('m');
$d          = $now->format('d');
$h          = $now->format('H');
$i          = $now->format('i');
$i2         = floor($i / 10) * 10;
$s          = $now->format('s');
$aws        = Aws::factory("/home/pi/aws/vendor/aws/aws-sdk-php/src/Aws/Common/Resources/aws-config.php");

// S3 の処理
$s3         = $aws->get('s3');
$s3backet   = "demo-distance";
$s3dir      = $now->format('Ymd');
$s3file     = "/var/www/distance.jpg";
$s3key      = $s3dir."/".$now->format('Ymd_His').".jpg";

// SQS の処理
$sqserr     = $aws->get('sqs');
$queueURL   = $sqserr->getQueueUrl(array('QueueName' => "test-hub_error"));

// Dynamo の処理
$dynamo     = $aws->get('dynamodb');
$dynamoTbl  = "demo-distance";            // TABLE NAME

$HashKey    = "D001-PIC-DIST";            // Hash Key(データID)
$RangeKey   = $y * 10000000000 + $m * 100000000 + $d * 1000000 + $h * 10000 + $i * 100 + $s;    // Range Key(日時)
$RangeKey01 = $h * 10000000000 + $i * 100000000 + $s * 1000000 + $y * 10000 + $m * 100 + $d;  // Range Key(時日)
$RangeKey02 = $now->format('Ymd_His').".jpg".$RangeKey;                                                                            // Range Key(結果値順)

$HashKey01  = $y * 100000000   + $m * 1000000   + $d * 10000 + $h * 100 + $i2;  // Hash Key(日時)
$RangeKey03 = $HashKey.strval($h * 10000 + $i * 100 + $s);                                         // Range Key(データID+時刻)

// カメラ画像?
if(file_exists($s3file)){

// Dynamo へのデータ保管処理
$data = array();
try{

// S3 の処理
if(!$s3->isValidBucketName($s3backet)){
$s3->createBucket(array( 'Bucket' => $s3backet, 'LocationConstraint' => 'ap-northeast-1' ));
}
$handle = fopen($s3file, "r");
$result = $s3->putObject(array(
'Bucket' => $s3backet,
'Key'    => $s3key,
'Body'   => EntityBody::factory($handle),
'ContentType' => image_type_to_mime_type(exif_imageType($s3file))
));

// Dynamo の処理
// Key
$data['HashKey']    = $HashKey;                           // Hash Key(データID)
$data['RangeKey']   = strval($RangeKey);           // Range Key(日時)
$data['RangeKey01'] = strval($RangeKey01);    // Range Key(時日)
$data['RangeKey02'] = strval($RangeKey02);   // Range Key(結果値順)

$data['HashKey01']  = strval($HashKey01);   // Hash Key(データID)
$data['RangeKey03'] = $RangeKey03;             // Range Key(日時)

// Data
$data['datetime']  = $datetime;
$data['s3backet']  = $s3backet;
$data['s3key']     = $s3key;
$data['localpath'] = $s3file;
$data['distance']  = $distance;
$data['unit']      = "cm";

// Save
$result = $dynamo->putItem(array(
'TableName'              => $dynamoTbl,
'Item'                   => $dynamo->formatAttributes($data),
'ReturnConsumedCapacity' => 'TOTAL'
));

// エラー発生時はSQSに保管
} catch (S3Exception $exc) {
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'S3 => '.$exc->getMessage()) );
} catch (DynamoDbException $exc2) {
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'Dynamo => '.$exc2->getMessage()) );
}

// 画像削除
//unlink($s3file);

}else{
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'No Photography ! ( '.$s3file.' )') );
}
?>
<code>


続いて、以下は定期的に画像を撮影・保管し、そのファイルを S3  にアップし、DynamoDB に保管時間と S3 のパスを記録します。

$ nano /home/pi/pgm/awsphp/ImageUp.php

 

</code>
#!/usr/bin/php
<?php

// SDK読込み
require_once('/home/pi/aws/vendor/autoload.php');

use Aws\Common\Aws;
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
use Aws\Sqs\SqsClient;
use Aws\Sqs\Exception\SqsException;
use Aws\Common\Enum\Region;
use Guzzle\Http\EntityBody;

// 現在日時取得
$now        = new DateTime();
$datetime   = $now->format('Y/m/d H:i:s');
$y          = $now->format('Y');
$m          = $now->format('m');
$d          = $now->format('d');
$h          = $now->format('H');
$i          = $now->format('i');
$i2         = floor($i / 10) * 10;
$s          = $now->format('s');
$aws        = Aws::factory("/home/pi/aws/vendor/aws/aws-sdk-php/src/Aws/Common/Resources/aws-config.php");

// S3 の処理
$s3         = $aws->get('s3');
$s3backet   = "demo-distance";
$s3dir      = $now->format('Ymd');
$s3file     = "/home/pi/data/".$now->format('Ymd_Hi').".jpg";
$s3key      = $s3dir."/".$now->format('Ymd_Hi').".jpg";

// カメラ画像取得
$imagecom = "sudo /opt/vc/bin/raspistill -t 1 -w 640 -h 480 -n -o ".$s3file;
exec($imagecom, $res);

// SQS の処理
$sqserr     = $aws->get('sqs');
$queueURL   = $sqserr->getQueueUrl(array('QueueName' => "test-hub_error"));

// Dynamo の処理
$dynamo     = $aws->get('dynamodb');
$dynamoTbl  = "demo-distance";            // TABLE NAME

$HashKey    = "D001-PIC-PERI";            // Hash Key(データID)
$RangeKey   = $y * 10000000000 + $m * 100000000 + $d * 1000000 + $h * 10000 + $i * 100 + $s;    // Range Key(日時)
$RangeKey01 = $h * 10000000000 + $i * 100000000 + $s * 1000000 + $y * 10000 + $m * 100 + $d;  // Range Key(時日)
$RangeKey02 = $now->format('Ymd_Hi').".jpg".$RangeKey;                                                                              // Range Key(結果値順)

$HashKey01  = $y * 100000000   + $m * 1000000   + $d * 10000 + $h * 100 + $i2;  // Hash Key(日時)
$RangeKey03 = $HashKey.strval($h * 10000 + $i * 100 + $s);                                         // Range Key(データID+時刻)

// カメラ画像?
if(file_exists($s3file)){

// Dynamo へのデータ保管処理
$data = array();
try{

// S3 の処理
if(!$s3->isValidBucketName($s3backet)){
$s3->createBucket(array( 'Bucket' => $s3backet, 'LocationConstraint' => 'ap-northeast-1' ));
}
$handle = fopen($s3file, "r");
$result = $s3->putObject(array(
'Bucket' => $s3backet,
'Key'    => $s3key,
'Body'   => EntityBody::factory($handle),
'ContentType' => image_type_to_mime_type(exif_imageType($s3file))
));

// Dynamo の処理
// Key
$data['HashKey']    = $HashKey;                         // Hash Key(データID)
$data['RangeKey']   = strval($RangeKey);         // Range Key(日時)
$data['RangeKey01'] = strval($RangeKey01);  // Range Key(時日)
$data['RangeKey02'] = strval($RangeKey02);  // Range Key(結果値順)

$data['HashKey01']  = strval($HashKey01);     // Hash Key(データID)
$data['RangeKey03'] = $RangeKey03;               // Range Key(日時)

// Data
$data['datetime']  = $datetime;
$data['s3backet']  = $s3backet;
$data['s3key']     = $s3key;
$data['localpath'] = $s3file;
$data['command']   = $imagecom;

// Save
$result = $dynamo->putItem(array(
'TableName'              => $dynamoTbl,
'Item'                   => $dynamo->formatAttributes($data),
'ReturnConsumedCapacity' => 'TOTAL'
));

// エラー発生時はSQSに保管
} catch (S3Exception $exc) {
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'S3 => '.$exc->getMessage()) );
} catch (DynamoDbException $exc2) {
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'Dynamo => '.$exc2->getMessage()) );
}

// 画像削除
unlink($s3file);

}else{
$sqserr->sendMessage( array('QueueUrl' => $queueURL, 'MessageBody' => 'No Photography ! ( '.$s3file.' )') );
}
?>
<code>


前へ 目次 次へ

広告

About Yukihito Kataoka
@ykataoka

現在コメントは受け付けていません。

%d人のブロガーが「いいね」をつけました。