В этой статье пошагово показано, как пример кода PHP-приложения (работающего на EC2) работает для подключения экземпляра MySQL RDS с использованием аутентификации IAM.
Аутентификация IAM
Включение и отключение аутентификации IAM
Это можно сделать с помощью AWS Management Console, AWS CLI или API и включить/выключить при создании нового экземпляра, изменении экземпляра или восстановлении снимка базы данных.
Создание учетной записи пользователя db для аутентификации IAM
При использовании MariaDB или MySQL аутентификация обрабатывается AWS Authentication Plugin. После подключения к экземпляру RDS выполните следующую команду.
Примечание: Для выполнения этого шага необходимо войти в экземпляр RDS, используя учетные данные главного пользователя с помощью клиента MySQL.
CREATE USER testu IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
После создания учетной записи пользователя, как указано выше, пользователь может управлять привилегиями обычной учетной записи, изменяя их (GRANT, REVOKE, ALTER).
Создание политики IAM и прикрепление к EC2
На этом этапе создайте IAM роль, назначив сервис AWS в качестве доверенного лица и EC2 в качестве сценария использования. После создания IAM-роли настройте внутреннюю политику, чтобы разрешить пользователю доступ к базе данных.
Примечание: Убедитесь, что указанное имя пользователя базы данных совпадает с именем ресурса в политике IAM для доступа к базе данных IAM.
Следующий пример политики позволяет пользователю IAM подключаться к экземпляру базы данных, используя аутентификацию базы данных IAM.
{ "
Version": "2012-10-17 ",
"Statement": [ { "
Effect": "Allow ", "
Action": [ "
rds-db:connect
" ], "
Resource": [ "
arn:aws:rds-db:<регион>:<account-id>:dbuser:<resourceId>/<db-username>
" ]
}
]
}
Замените следующие слова соответствующим образом,
После того, как все сделано с политикой, прикрепите роль к EC2, на котором запущено приложение.
Подключение к экземпляру RDS с помощью аутентификации IAM
Аутентификация базы данных IAM использует токен аутентификации при подключении к экземпляру БД. Токен аутентификации - это строка символов, которая используется вместо пароля.
Каждый токен аутентификации должен сопровождаться действительной подписью, используя подпись AWS версии 4. AWS SDK, например AWS SDK для Java или Python или PHP, может автоматически подписывать каждый создаваемый вами токен, а также может использоваться для программного создания и программной подписи токена аутентификации.
В этой статье описано, как подключиться из командной строки к экземпляру БД Amazon RDS с помощью AWS CLI и инструмента командной строки mysql.
Следующий пример PHP-кода показывает, как сгенерировать токен аутентификации с помощью AWS SDK, а затем использовать его для подключения к экземпляру под управлением MariaDB или MySQL.
<?php
$clusterEndpoint = "<ENDPOINT-URL>";
$clusterPort = <PORT>;
$clusterRegion = "<REGION>";
$dbUsername = "<USER-NAME>";
$dbDatabase = "USER";
// Установка AWS-PHP-SDK через Composer
require 'vendor/autoload.php';
use Aws\Credentials\CredentialProvider;
$provider = CredentialProvider::defaultProvider();
$RdsAuthGenerator = new Aws\Rds\AuthTokenGenerator($provider);
$token = $RdsAuthGenerator->createToken($clusterEndpoint . ":" . $clusterPort, $clusterRegion, $dbUsername);
$mysqli = mysqli_init();
$mysqli->ssl_set(NULL,NULL,'/home/global-bundle.pem',NULL,NULL);
$mysqli->real_connect($clusterEndpoint, $dbUsername, $token, $dbDatabase, $clusterPort);
if ($mysqli->connect_errno) {
echo "Ошибка: Failed to make a MySQL connection, here is why: <br />";
echo "Errno: " . $mysqli->connect_errno . "<br />";
echo "Ошибка: " . $mysqli->connect_error . "<br />";
exit;
}
/***** Пример кода для выполнения запроса и возврата всех таблиц в БД *****/
$tableList = array();
$res = mysqli_query($mysqli, "SHOW TABLES");
while($cRow = mysqli_fetch_array($res))
{
$tableList[] = $cRow[0];
}
echo '<pre>';
print_r($tableList);
echo '</pre>';
Замените следующие слова соответствующим образом,
Для подключения и аутентификации клиента через IAM требуется SSL. Во время выполнения код ищет сертификат в том же каталоге, что и этот пример PHP-кода, чтобы загрузчик классов мог его найти. Используйте эту ссылку, чтобы получить пакет сертификатов, содержащий промежуточный и корневой сертификаты для всех регионов AWS.
Когда приведенный выше пример кода будет запущен на EC2, он вернет имена всех таблиц в базе данных USER , как показано ниже.