CyberduckでS3にAWS IAM Identity Center(旧AWS SSO)で接続する方法

# これはなに
タイトルの通りですが
- AWS IAM Identity Center(旧AWS SSO)のアクセス情報をもらった！けどCyberDuckでS3にアクセスできない！
- AWS IAM Identity Center(旧AWS SSO)に切り替えていきたい！けどCyberduckを利用しているメンバーにS3への接続方法をどう伝えれば…？

となっている人の助けになれば

# お急ぎの方は
- [事前設定](https://qiita.com/harigel/items/7e249d6693ec095011b8#%E4%BA%8B%E5%89%8D%E8%A8%AD%E5%AE%9A)
- [CyberduckでS3に接続する](https://qiita.com/harigel/items/7e249d6693ec095011b8#cyberduck%E3%81%A7s3%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B)

# 序文
（2024/09/04現在）

旧来はS3へのアクセスにIAMユーザを作成し
```sh
AWS_ACCESS_KEY_ID=XXX
AWS_SECRET_ACCESS_KEY=XXX
```
のようにアクセスキーを利用することが一般的だったように思います。
しかし最近はアクセスキーのような長期的認証情報を作成することは非推奨になっています。

`IAM Identity Center`(旧`AWS SSO`)がよく利用されるようになり、ブラウザやCLIから利用する分にはセキュアで大変便利です。

しかし、GUIアプリでは問題があります。
IAM Identity Centerでは一時的な認証情報が発行されますが、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYの他に `AWS_SESSION_TOKEN` の設定が必要です。
これに対応していない、または対応していても非常にわかりにくいものが多い印象です。

私はS3へのファイルアップロードにCyberDuckをよく利用しますが、設定が複雑だったのでここにまとめます。

# Cyberduckでの設定方法
Cyberduck公式に記載があります。
https://docs.cyberduck.io/protocols/s3/#connecting-using-credentials-from-aws-command-line-interface

が、すんなり設定できなかったので噛み砕いて説明します。

# 前提条件
（必ずしもこれではないと動かないということはないと思いますが）

macOS Sonoma 14.6.1
Cyberduck 9.0.1
aws-cli 2.9.16

# 事前設定

## Cyberduckのインストール
(インストール済みなら次へ)

https://cyberduck.io/

## AWS CLIのインストール
(インストール済みなら次へ)

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

インストールの確認は以下コマンドでバージョン番号が表示されること。
```
aws --version
```

## AWS CLIにIAM Identity Centerの設定(profile)を追加
(設定済みなら次へ)

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-sso.html

- まずはブラウザでAWS access portalにアクセスできることを確認
![ss- 2024-09-04 10.33.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301/6de99e58-ee22-7e27-a925-802167fc3542.png)

- 上記画面のURLを覚えておく
以下は https://`xxx`.awsapps.com/start/... だった場合の設定例

- AWS のprofile名を決める
ここではSOMEプロジェクト用のAWSアカウントのAdministratorAccessロールとして`xxx_some_admin`とする

- AWS CLIでSSOの設定をする
    ```
    $ aws configure sso --profile xxx_some_admin
    SSO session name (Recommended): xxx-sso
    SSO start URL [None]: https://xxx.awsapps.com/start
    SSO region [None]: ap-northeast-1
    SSO registration scopes [None]: sso:account:access
    ```

    - ブラウザが起動してAWSへのアクセス許可を求められるので許可する
    - ターミナルに戻る
    - 利用できるAWSアカウントが列挙されるので選択する(例 `999999999999`)
        - 1つしかない場合はスキップされるかも
    - 利用できるロールが列挙されるので選択する(例 `AdministratorAccess`)
        - 1つしかない場合はスキップされるかも
    - リージョンを聞かれるので設定する(東京なら`ap-northeast-1`)
    - CLI default output formatを指定(大抵`json`で良い)
    - `~/.aws/config` に設定が追加される（テキストエディタで直接編集しても良い）
        ```config
        [sso-session xxx-sso]
        sso_start_url = https://xxx.awsapps.com/start
        sso_region = ap-northeast-1
        sso_registration_scopes = sso:account:access

        [profile xxx_some_admin]
        sso_session = xxx-sso
        sso_account_id = 999999999999
        sso_role_name = AdministratorAccess
        region = ap-northeast-1
        output = json
        ```

## Cyberduckにprofile(cyberduckprofile)を追加
(設定済みなら次へ)

Cyberduckはprofile(拡張子`.cyberduckprofile`)で接続方法を追加することができる。
以下の`S3 (Credentials from AWS Command Line Interface) profile for preconfigured settings`をダウンロードしてダブルクリックする。

https://profiles.cyberduck.io/S3%20(Credentials%20from%20AWS%20Command%20Line%20Interface).cyberduckprofile

![ss- 2024-09-04 11.50.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301/49e69b17-2a0a-025c-a00b-044a90212e55.png)

CyberDuckの環境設定→Profilesで上記が追加されていればOK

## 以上で事前準備は完了です
おつかれさまでした。

# CyberduckでS3に接続する
いよいよ接続です。

## AWS CLIでログインする
事前準備で設定したAWS profileでログインする。
以下では`xxx_some_admin`の例

```sh
aws sso login --profile xxx_some_admin
```

Cyberduckから認証情報を取得するためにもう1手間
(`~/.aws/sso/cache` に認証情報がキャッシュされ、CyberDuckがこれを参照する)
```sh
aws sts get-caller-identity --profile xxx_some_admin
```

## Cyberduckに接続情報を設定
ブックマーク編集画面で以下を設定
(設定済みなら次へ)

![ss- 2024-09-04 12.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301/9cc040e6-2d0a-30e1-0eb7-d3d120a4fa8a.png)

- (1) `S3 (Credentials from AWS Command Line Interface)`を選択
- (2) AWS profileを指定する
- (3) S3のバケット名を指定する

## 接続する

あとは通常通りブックマークから接続すればOKです。

# うまくいかない時は

ここからデバッグログを確認できます。
AWSに強い人に助けを求めてみてください。
![ss- 2024-09-04 13.35.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301/dc9830f3-4481-a910-dff9-07e30efd1146.png)

私の場合は、`~/.aws/config` と `~/.aws/credentials` にコメントアウトした行があったのが原因でした。

# 感想
もっと簡単になってほしい！

おわり