やりたいこと
・ AWS SDK for PHPを使用してローカル環境からS3等を使用したい
・ IAMユーザの権限はAssumeRoleのみ
・ IAMユーザを使用するにはMFA認証を必須としたい
・ IAMユーザのアクセスキーは「~/.aws/credentials」にのみ保存したい
事前準備(詳細は割愛)
・IAMユーザの作成
・IAMユーザにMFA認証を追加
・IAMユーザのアクセスキー発行
・IAMユーザの権限はAssumeRoleのみ(MFAを必須とする)
・ロールの作成
・ロールの権限は必要な権限(S3とか)を付与
・ロールの信頼関係に作成したIAMユーザを追加
・~/.aws/credentialsに発行したアクセスキー等を登録
困っていたこと
AWS SDK for PHPの開発ガイドにはロールの引き受け(AssumeRole)や一時的な認証情報に関することが記載されているがMFA認証に関する記述がなかった
こっちにはPythonではあるがMFA認証&AssumeRoleを使用したS3へのアクセス方法が記載されているが、MFAの認証コード(30秒のワンタイムパスワード)を使用しており、現実的ではない
※自分がやりたいのはDockerコンテナ内で起動するWEBアプリケーションである
特定のページへアクセスした際にS3等を使用するので事前にワンタイムパスワードを設定することは困難である
解決策(とりあえず感があるけど)
まずはコード
{
$this->s3 = new S3Client([
'version' => 'latest',
'region' => 'ap-northeast-1',
'credentials' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'token' => env('AWS_SESSION_TOKEN'),
],
]);
}
環境変数に下記3つを登録(設定する値は後述)
・AWS_ACCESS_KEY_ID
・AWS_SECRET_ACCESS_KEY
・AWS_SESSION_TOKEN
CLIコマンドを使用して一時的な認証情報を取得
aws sts assume-role --role-arn "AssumeRoleのロールarn" --role-session-name "temp-session(任意のセッション名)" --serial-number "登録したMFAのarn" --token-code "123456(MFAの認証コード)" --profile credentialsに登録した名前(デフォルトの場合は不要かな?)
このコマンドの結果は以下
{
"Credentials": {
"AccessKeyId": "一時的なアクセスキー",
"SecretAccessKey": "一時的なシークレットキー",
"SessionToken": "一時的なセッショントークン",
"Expiration": "有効期限(UTC)"
},
略
ここで取得したAccessKeyId、SecretAccessKey、SessionTokenを環境変数(.envファイル等)に設定して、コンテナを起動することでコンテナ内で起動するWEBアプリケーションがAWSサービスを使用することができる