やりたいこと
・ 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サービスを使用することができる
