[AWS] PHP SDK - RDS 오로라 클러스터
오로라 클러스터 사용시 인스턴스를 추가, 삭제 하는 PHP SDK 예제 입니다.
비교적 간단한 형태 이며 AWS 키는 본인의 환경에 맞게 변경 하면 됩니다.
use Aws\Rds\RdsClient;
class PabburiAws {
function profile() {
$aAwsConfig = [
'region' => AWS_REGION,
'version' =>'latest',
'credentials' => [ 'key' => AWS_ACCESS_KEY_ID, 'secret' => AWS_SECRET_ACCESS_KEY ]
];
return $aAwsConfig;
}
}
/**
* AWS RDS
*
* @package
*/
class PabburiAwsRds extends PabburiAws
{
private $client;
function __construct() {
$this->client();
}
/**
* rds 커넥션
* @return Aws\Rds\RdsClient
*/
function client() {
if ( $this->client != null ) $this->client;
$aAwsProfile = $this->profile();
$client = new RdsClient($aAwsProfile);
$this->client = $client;
return $client;
}
/**
* rds 인스턴스 목록
*
* @param string $mode
* @return mixed
*/
function list( $mode='' )
{
$client = $this->client();
$result = $client->describeDBInstances([]);
// print_r($result);
$aInstanceList = [];
$aStatus = [];
foreach ($result['DBInstances'] as $dbInstance) {
extract($dbInstance);
// echo "$DBClusterIdentifier($DBInstanceStatus) - DBInstanceIdentifier: $DBInstanceIdentifier / PubliclyAccessible:$PubliclyAccessible $Engine \n";
$Endpoint = $dbInstance['Endpoint']['Address'];
$aInfo = [
'clusterName' => $DBClusterIdentifier,
'id' => $DBInstanceIdentifier,
'Endpoint' => $Endpoint,
'AvailabilityZone' => $AvailabilityZone,
'PubliclyAccessible' => $PubliclyAccessible,
'status' => $DBInstanceStatus,
];
$aInstanceList[$DBInstanceIdentifier] = $aInfo;
$aStatus[$DBInstanceIdentifier] = $DBInstanceStatus;
}
if ( $mode == 'status' ) {
return $aStatus;
}
else {
return $aInstanceList;
}
}
/**
* 인스턴스 추가 - 클러스터는 이 방식을 사용 한다.
*
* @param mixed $newDbIdentifier
* @return mixed
*/
function read_insert( $newDbIdentifier )
{
$client = $this->client();
$result = $client->createDBInstance([
'DBInstanceIdentifier' => $newDbIdentifier,
// 아래는 미리 정해놓은 상수를 이용하도록 한다.
'DBClusterIdentifier' => 'database-1',
'Engine' => 'aurora-mysql',
'DBInstanceClass' => 'db.t4g.medium',
]);
// print_r($result);
$status = $result->get('DBInstance')['DBInstanceStatus'];
return $status;
}
/**
* rds 삭제
*
* @param mixed $id
* @return mixed
*/
function delete( $id )
{
$client = $this->client();
// available 인것만 삭제 해야 한다.
$aStatus = $this->list( 'status' );
if ( $aStatus[$id] != 'available' ) {
echo "$id Not available: " . $aStatus[$id] . PHP_EOL;
return false;
}
// 이 값이 true이면 최종 스냅샷을 건너뜁니다.
// 만약 스냅샷을 원한다면 false로 설정하고, FinalDBSnapshotIdentifier 옵션도 추가하세요.
$result = $client->deleteDBInstance([ 'DBInstanceIdentifier' => $id, 'SkipFinalSnapshot' => true ]);
// print_r($result);
$status = $result->get('DBInstance')['DBInstanceStatus'];
return $status;
}
}
위에서 주의할것은 읽기 인스턴스 메소드를 createDBInstanceReadReplica 사용할것이라 착각 할 수있다는 것입니다.
createDBInstance 메소드를 사용해야 됩니다.
$HOST_NAME = php_uname('n');
$MODE = '';
$TYPE = '';
if ( isset($argv[1]) ) $MODE = $argv[1];
if ( isset($argv[2]) ) $TYPE = $argv[2];
require __DIR__ . '/aws_sdk/aws-autoloader.php';
$oAwsRds = new PabburiAwsRds();
#
if ( $MODE == 'list' ) {
$result = $oAwsRds->list();
print_r($result);
}
#
else if ( $MODE == 'del' ) {
$id = $TYPE;
$status = $oAwsRds->delete($id);
echo "결과: " . $status . PHP_EOL;
}
#
else if ( $MODE == 'insert' ) {
$newDbIdentifier = $TYPE;
$status = $oAwsRds->read_insert( $newDbIdentifier );
// print_r($status);
echo '결과: ' . $status . PHP_EOL;
}
현재 계정의 전체 데이터베이스 현황을 볼 수 있는 기능과
삭제, 추가 할 수 있습니다. 삭제는 정상적으로 운영 되는 것만 가능하기 때문에 체크하는 기능이 추가적으로 필요 합니다.
삭제 할 수 없는 인스턴스를 삭제 하려면 삭제 할 수 없기 때문에 오류가 발생 합니다.
실 서비스 운영에서는 삭제나 추가 후 전체 현황을 보는 것을 추가 해서 확인 해야 합니다.
* 참고할것
- [AWS] 오로라-MySQL 데이터베이스 생성 옵션 > AWS.클라우드