IAM Roles AnywhereとNetApp DataOps Toolkitを使ってAmazon S3を操作してみる

# 本記事の要約
- NetApp DataOps Toolkitは、NetApp ONTAPストレージの操作の他にAmazon S3の操作（データのPut/Get）ができる。

- IAM Roles Anywhereを利用することで、NetApp DataOps ToolkitのConfigでAWSのアクセスキー/シークレットキーのクレデンシャル設定を省略し、よりセキュアに利用することができる。
つまり、AWS外のオンプレミスでNetApp DataOps Toolkitを使い、NetApp ONTAPストレージの操作を行いつつ、セキュアにAmazon S3の操作も可能になる。

- 以前投稿した「Amazon SageMakerとAmazon FSx for NetApp ONTAPで実現する機械学習基盤」の派生版になります。（NetApp DataOps ToolkitをAWS外で利用することを想定）

:::note warn
以前投稿した「Amazon SageMakerとAmazon FSx for NetApp ONTAPで実現する機械学習基盤」の記事はこちら
- 第1回記事：https://qiita.com/Yoshinori_Tsukioka/items/e02537feb8008db46a99
- 第2回記事：https://qiita.com/Yoshinori_Tsukioka/items/0bdb5162f2ee25c82f32
- 第3回記事：https://qiita.com/Yoshinori_Tsukioka/items/2b6070a235b67634a2db
- 第4回記事：https://qiita.com/Yoshinori_Tsukioka/items/9016dd5c31293d76dd35
- 派生記事：https://qiita.com/Yoshinori_Tsukioka/items/d3abb579ec068323c125
:::

# 何故、IAM Roles Anywhereを利用するのか
おさらいですが、NetApp DataOps ToolkitはNetApp ONTAPを利用するストレージ向けに提供されるPythonライブラリです。
NetApp DataOps Toolkitを利用することで、データサイエンティストやデータエンジニア自身でネットアップストレージのVolume作成や複製、Snapshot取得などの処理を簡単に操作可能です。

また、S3へデータをGet/Put操作も可能ですので、データセットやトレーニング済みデータをS3へ格納したり、またはS3からダウンロードしたりといった操作も可能です。（NetApp DataOps Toolkit上では、Pull/Pushと表現されています。）

GitHubに公開されていますので、どなたでも利用することが可能です。
今回は、Traditional版を利用します。
https://github.com/NetApp/netapp-dataops-toolkit/tree/main/netapp_dataops_traditional

READMEを見てみると、Configの設定例でS3接続のためのアクセスキー/シークレットキーのクレデンシャル情報を入力しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/5965f527-b71f-92f2-a7b5-13d09bc4e9b6.png)
Amazon S3との接続時にシークレットキーとアクセスキーを安易に使うとキー漏洩時のことやキーのローテーションなど運用面での考慮が必要になるので、今回はIAM Roles Anywhereを利用してみるということです。

# やってみた
今回の検証イメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/8c764a8e-9a9c-998f-507f-d2160a4b01a2.png)
- IAM Roles Anywhereを利用できる環境を作成し、オンプレミスに準備したサーバーへaws_signing_helperをインストールする。
- IAM Roles Anywherの準備が完了した後、NetApp DataOps Toolkitをインストールし、Config設定でクレデンシャル情報を省略した上でAmazon S3からデータをダウンロードしてみる。

# IAM Roles Anywhereの構築
- まずオンプレミスのサーバーで秘密鍵と署名リクエスト（CSR）を作成します。

```bash
$ openssl req -out csr.pem -new -newkey rsa:2048 -nodes -keyout private-key.pem
Generating a RSA private key
.................................................+++++
...................................................................................+++++
writing new private key to 'private-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka
Organization Name (eg, company) [Default Company Ltd]:demo
Organizational Unit Name (eg, section) []:tech
Common Name (eg, your name or your server's hostname) []:sample
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

```

- 作成した秘密鍵と署名リクエスト（CSR）を確認します。
```bash
$ ls -la private-key.pem csr.pem
-rw-r--r-- 1 root root  989  8月 23 16:05 csr.pem
-rw------- 1 root root 1704  8月 23 16:04 private-key.pem
```

- AWSマネジメントコンソールにログインし、AWS Private Certificate Authorityで認証局を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/11f0404c-1ec4-e09e-cacf-191533707bd2.png)

- プライベート認証機関（CA）を作成する画面で、モード「有効期間の短い証明書」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/c2e027d4-9b9c-e684-c04a-3b36f13242ad.png)

- サブジェクトの識別名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/67f1464b-65cf-9e59-81c4-8d92e9f00481.png)

- キーアルゴリズムを選択します。（今回は、RSA 2048を選択しました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/56e89540-faff-52c2-2165-bd5faa292233.png)

- 画面最下部の「料金」にチェックを入れ、「CAを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/2a77fc02-d1b9-dd5f-c341-3aaddb81909d.png)

- 認証局が作成されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/f31b5e27-3b6e-4d7a-8239-120a63ae104f.png)

- 作成された認証局を選択し、アクションタブから「CA証明書をインストール」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/33049927-8743-4d1b-5a64-57054a6d5f62.png)

- 有効期限を確認し、「確認してインストール」をクリックします。
なお、デフォルトの有効期限は10年になり、伸ばすこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/59b74049-b8a9-6cc9-6770-bf4a6b94925b.png)

- 認証局のステータスがアクティブになったことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/dfafe64f-2a26-3703-31ac-9e74706ae751.png)

:::note
後続の作業で利用しますので、作成された認証局のARNを控えておくことをお勧めします。
:::


- 続いて、CloudShellを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/87440be1-0406-305b-1eb0-85a18af0a1a5.png)

- オンプレミスで作成した署名リクエスト（csr.pem）をCloudShell上に作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/a760f30a-0e7c-d6af-be32-872e9a53f6ba.png)

- CloudShell上でエンドエンティティ証明書を発行します。
「--certificate-authority-arn」の中身を、認証局(Private CA (Short-Liveモード) )の ARN に置き換えてください。暗号化方式は 認証局 の作成時に選んだ RSA （SHA256WITHRSA）にしています。
有効期間は、Short-Live モードの最長である７日にしました。
```bash
$ aws acm-pca issue-certificate \
      --certificate-authority-arn arn:aws:acm-pca:region:account:certificate-authority/CA_ID \
      --csr fileb://csr.pem \
      --signing-algorithm “SHA256WITHRSA” \
      --validity Value=7,Type=“DAYS”
```

:::note
後続の作業で利用しますので、コマンドで出力されたエンドエンティティ証明書のARN（CertificateArn）を控えておくことをお勧めします。
:::


- エンドエンティティ証明書をcert.pemファイルに書き込みます。
「--certificate-authority-arn」は認証局(Private CA (Short-Liveモード) )の ARN です。
「--certificate-arn」は、エンドエンティティ証明書の ARN （上で控えたもの）です。

```bash
$ aws acm-pca get-certificate \
--certificate-authority-arn arn:aws:acm-pca:region:account:certificate-authority/CA_ID \
--certificate-arn arn:aws:acm-pca:region:account:certificate-authority/CA_ID/certificate/CERTIFICATE_ID | \
jq -r .'Certificate' > cert.pem
```

- CloudShellのアクションタブからファイルのダウンロードを行い、オンプレミスのサーバーにcert.pemを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/362cdc32-da06-0caf-ef61-40d0e232cb6a.png)

- 続いて、AWSマネジメントコンソールからIAMロールの作成を行います。
カスタム信頼ポリシーを設定し、認証に利用するエンドエンティティ証明書のIssuer/SubjectのCNとOUの値がCondition句に定義した値と一致した場合にIAMロールを引き受けるように設定します。

:::note warn
Condition句を定義しないと、信頼アンカーに登録している証明書であれば、どの証明書でもIAMロールを引き受けることができてしまいます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/11ed7450-95c7-926c-5d3d-ad5e70856818.png)

　カスタム信頼ポリシーの中身は以下のように定義しました。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "rolesanywhere.amazonaws.com"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:SetSourceIdentity",
                "sts:TagSession"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalTag/x509Issuer/CN": "sample",
                    "aws:PrincipalTag/x509Issuer/OU": "tech",
                    "aws:PrincipalTag/x509Subject/CN": "sample",
                    "aws:PrincipalTag/x509Subject/OU": "tech"
                }
            }
        }
    ]
}
```

- カスタム信頼ポリシーの設定が完了した後、作成するIAMロールに付与する許可ポリシーを付与し、最後に任意の名前を付けてIAMロールの作成を完了させます。

- 続いて、IAM Roles Anywhereの設定を行います。
IAMロールの画面下部にRoles Anywhereの項目があることを確認し、「管理」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/c173f039-8fa6-7e0a-e9cb-19c16ce603d7.png)

:::note warn
Roles Anywhereの画面に遷移した際、選択されているリージョンに注意してください。
IAMはグローバルサービスですが、IAM Roles Anywhereはリージョンサービスとなるため、認証局と同じリージョンで設定する必要があります。
:::

- 信頼アンカーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/84a9c46b-3e09-fc22-fc48-d90901127c09.png)

- アンカー名とプライベートCAを選択し、信頼アンカーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/b6d67ea7-b26d-940b-17f8-e32f3cdfb238.png)

- 信頼アンカーが作成されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/9021cacd-55f0-f988-60b9-99d8c7e32c2e.png)

- プロファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/b0f992f2-3f74-14da-ca71-9f10f476496b.png)

- プロファイル名と前段の手順で作成したIAMロールを設定し、プロファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806894/f6dafa74-5b99-9650-fd73-721085b21a39.png)

:::note
後続の作業で利用しますので、作成した信頼アンカーとプロファイルのARNを控えておくことをお勧めします。
:::

以上で、IAM Roles Anywhereの構築は完了です。

# オンプレミスのサーバーにaws_signing_helperを導入し、IAM Roles Anywhereを使ってみる。
- オンプレミスのサーバーにヘルパーツール（aws_signing_helper）を導入します。
aws_signing_helperの利用方法などは、公式マニュアルをご参照ください。
https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html

```bash
$ wget https://rolesanywhere.amazonaws.com/releases/1.0.4/X86_64/Linux/aws_signing_helper
$ chmod +x aws_signing_helper
$ ./aws_signing_helper version
1.0.4
```
　aws_signing_helperは、以下のようなコマンドで利用します。
　作成した証明書/秘密鍵/トラストアンカーのARN/プロファイルのARN/IAMロールのARNを使います。
```bash
$ ./aws_signing_helper credential-process \
     --certificate ./cert.pem \
     --private-key ./private-key.pem \
     --trust-anchor-arn $TA_ARN \
     --profile-arn $PROFILE_ARN \
     --role-arn $ExampleS3WriteRole_ARN
```

- コマンドを実行します。（出力結果は、サンプルです）
```bash
$ ./aws_signing_helper credential-process --certificate ./cert.pem --private-key ./private-key.pem --trust-anchor-arn "トラストアンカーのARN" --profile-arn "プロファイルのARN" --role-arn "IAMロールのARN"
{"Version":1,"AccessKeyId":"hogehogehoge","SecretAccessKey":"hogehogehoge","SessionToken":"hogehogehoge","Expiration":"2023-08-23T08:11:17Z"}
```

- 取得できた認証情報を環境変数に登録します。
```bash
$ export AWS_ACCESS_KEY_ID="取得したアクセスキー"
$ export AWS_SECRET_ACCESS_KEY="取得したシークレットキー"
$ export AWS_SESSION_TOKEN="取得したセッショントークン"
```
- 試しにs3 lsコマンドが実行できるか確認してみます。（出力結果は、サンプルです）
```bash
$ aws s3 ls | grep tsukioka
2023-07-10 15:51:17 tsukioka-hogehoge-bucket001
```
　正常にs3バケットのlsが動作しました。
　IAM Roles Anywhereから取得した認証情報を使って、S3への接続が成功したようです。

# NetApp DataOps Toolkitを使って、Amazon S3からデータをダウンロードしてみる。
IAM Roles Anywhereで取得した認証情報が、NetApp DataOps Toolkitでも使えるのか確認してみます。

- NetApp DataOps Toolkitをインストールします。
```bash
$ python3 -m pip install netapp-dataops-traditional
Defaulting to user installation because normal site-packages is not writeable
Collecting netapp-dataops-traditional
  Downloading netapp_dataops_traditional-2.1.1-py3-none-any.whl (22 kB)
Collecting boto3
  Downloading boto3-1.23.10-py3-none-any.whl (132 kB)
     |████████████████████████████████| 132 kB 30.7 MB/s            
Requirement already satisfied: requests in ./.local/lib/python3.6/site-packages (from netapp-dataops-traditional) (2.27.1)
Requirement already satisfied: pyyaml in /usr/lib64/python3.6/site-packages (from netapp-dataops-traditional) (3.12)
Collecting netapp-ontap
  Downloading netapp_ontap-9.13.1.0-py3-none-any.whl (25.7 MB)
     |████████████████████████████████| 25.7 MB 14.7 MB/s            
Collecting tabulate
  Downloading tabulate-0.8.10-py3-none-any.whl (29 kB)
Collecting pandas
  Downloading pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl (9.5 MB)
     |████████████████████████████████| 9.5 MB 69.0 MB/s            
Collecting s3transfer<0.6.0,>=0.5.0
  Downloading s3transfer-0.5.2-py3-none-any.whl (79 kB)
     |████████████████████████████████| 79 kB 12.4 MB/s            
Collecting botocore<1.27.0,>=1.26.10
  Downloading botocore-1.26.10-py3-none-any.whl (8.8 MB)
     |████████████████████████████████| 8.8 MB 72.4 MB/s            
Collecting jmespath<2.0.0,>=0.7.1
  Downloading jmespath-0.10.0-py2.py3-none-any.whl (24 kB)
Collecting urllib3>=1.26.7
  Downloading urllib3-1.26.16-py2.py3-none-any.whl (143 kB)
     |████████████████████████████████| 143 kB 68.3 MB/s            
Collecting marshmallow>=3.2.1
  Downloading marshmallow-3.14.1-py3-none-any.whl (47 kB)
     |████████████████████████████████| 47 kB 8.3 MB/s             
Collecting requests-toolbelt>=0.9.1
  Downloading requests_toolbelt-1.0.0-py2.py3-none-any.whl (54 kB)
     |████████████████████████████████| 54 kB 5.6 MB/s             
Requirement already satisfied: certifi>=2022.12.7 in ./.local/lib/python3.6/site-packages (from netapp-ontap->netapp-dataops-traditional) (2023.7.22)
Requirement already satisfied: idna<4,>=2.5 in ./.local/lib/python3.6/site-packages (from requests->netapp-dataops-traditional) (3.4)
Requirement already satisfied: charset-normalizer~=2.0.0 in ./.local/lib/python3.6/site-packages (from requests->netapp-dataops-traditional) (2.0.12)
Collecting python-dateutil>=2.7.3
  Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
     |████████████████████████████████| 247 kB 46.7 MB/s            
Collecting numpy>=1.15.4
  Downloading numpy-1.19.5-cp36-cp36m-manylinux2010_x86_64.whl (14.8 MB)
     |████████████████████████████████| 14.8 MB 31.6 MB/s            
Requirement already satisfied: pytz>=2017.2 in /usr/lib/python3.6/site-packages (from pandas->netapp-dataops-traditional) (2017.2)
Requirement already satisfied: six>=1.5 in /usr/lib/python3.6/site-packages (from python-dateutil>=2.7.3->pandas->netapp-dataops-traditional) (1.11.0)
Installing collected packages: urllib3, python-dateutil, jmespath, botocore, s3transfer, requests-toolbelt, numpy, marshmallow, tabulate, pandas, netapp-ontap, boto3, netapp-dataops-traditional
Successfully installed boto3-1.23.10 botocore-1.26.10 jmespath-0.10.0 marshmallow-3.14.1 netapp-dataops-traditional-2.1.1 netapp-ontap-9.13.1.0 numpy-1.19.5 pandas-1.1.5 python-dateutil-2.8.2 requests-toolbelt-1.0.0 s3transfer-0.5.2 tabulate-0.8.10 urllib3-1.26.16

```

- helpコマンドを実行し、NetApp DataOps Toolkitがインストールされたか確認します。
```bash
$ netapp_dataops_cli.py help

The NetApp DataOps Toolkit is a Python library that makes it simple for data scientists and data engineers to perform various data management tasks, such as provisioning a new data volume, near-instantaneously cloning a data volume, and near-instantaneously snapshotting a data volume for traceability/baselining.

Basic Commands:

        config                          Create a new config file (a config file is required to perform other commands).
        help                            Print help text.
        version                         Print version details.

Data Volume Management Commands:
Note: To view details regarding options/arguments for a specific command, run the command with the '-h' or '--help' option.

        clone volume                    Create a new data volume that is an exact copy of an existing volume.
        create volume                   Create a new data volume.
        delete volume                   Delete an existing data volume.
        list volumes                    List all data volumes.
        mount volume                    Mount an existing data volume locally. Note: on Linux hosts - must be run as root.
        unmount volume                  Unmount an existing data volume. Note: on Linux hosts - must be run as root.

Snapshot Management Commands:
Note: To view details regarding options/arguments for a specific command, run the command with the '-h' or '--help' option.

        create snapshot                 Create a new snapshot for a data volume.
        delete snapshot                 Delete an existing snapshot for a data volume.
        list snapshots                  List all snapshots for a data volume.
        restore snapshot                Restore a snapshot for a data volume (restore the volume to its exact state at the time that the snapshot was created).

Data Fabric Commands:
Note: To view details regarding options/arguments for a specific command, run the command with the '-h' or '--help' option.

        list cloud-sync-relationships   List all existing Cloud Sync relationships.
        sync cloud-sync-relationship    Trigger a sync operation for an existing Cloud Sync relationship.
        pull-from-s3 bucket             Pull the contents of a bucket from S3.
        pull-from-s3 object             Pull an object from S3.
        push-to-s3 directory            Push the contents of a directory to S3 (multithreaded).
        push-to-s3 file                 Push a file to S3.

Advanced Data Fabric Commands:
Note: To view details regarding options/arguments for a specific command, run the command with the '-h' or '--help' option.

        prepopulate flexcache           Prepopulate specific files/directories on a FlexCache volume (ONTAP 9.8 and above ONLY).
        list snapmirror-relationships   List all existing SnapMirror relationships.
        sync snapmirror-relationship    Trigger a sync operation for an existing SnapMirror relationship.
```
:::note
Data Fabric Commands：の欄にあるようにS3へデータをPull/Pushするコマンドが利用できます。
:::

- NetApp DataOps ToolkitのConfigを設定します。
```bash
$ netapp_dataops_cli.py config
Enter ONTAP management LIF hostname or IP address (Recommendation: Use SVM management interface): "ONTAP managemet LIFのIP"
Enter SVM (Storage VM) name: "SVM Name"
Enter SVM NFS data LIF hostname or IP address: "SVMのIP"
Enter default volume type to use when creating new volumes (flexgroup/flexvol) [flexgroup]: flexvol
Enter export policy to use by default when creating new volumes [default]: 
Enter snapshot policy to use by default when creating new volumes [none]: 
Enter unix filesystem user id (uid) to apply by default when creating new volumes (ex. '0' for root user) [0]: 
Enter unix filesystem group id (gid) to apply by default when creating new volumes (ex. '0' for root group) [0]: 
Enter unix filesystem permissions to apply by default when creating new volumes (ex. '0777' for full read/write permissions for all users and groups) [0777]: 0777
Enter aggregate to use by default when creating new FlexVol volumes: 
Enter ONTAP API username (Recommendation: Use SVM account): "SVM操作User"
Enter ONTAP API password (Recommendation: Use SVM account): "SVM操作Userのパスワード"
Verify SSL certificate when calling ONTAP API (true/false): false
Do you intend to use this toolkit to trigger Cloud Sync operations? (yes/no): no
Do you intend to use this toolkit to push/pull from S3? (yes/no): yes
Enter S3 endpoint: https://s3.ap-northeast-1.amazonaws.com
Enter S3 Access Key ID: 
Enter S3 Secret Access Key: 
Verify SSL certificate when calling S3 API (true/false): true
Enter CA cert bundle to use when calling S3 API (optional) []: /usr/local/lib/python3.10/site-packages/certifi/cacert.pem               
Created config file: '.netapp_dataops/config.json’.
```

:::note
- S3 endpointは、利用するリージョンに合わせて設定してください。
- S3 Access Key ID / S3 Secret Access Keyは、Enterを押して省略してください。
- Verify SSL certificate when calling S3 APIは、trueを選択してください。
falseにすることもできますが、Amazon S3へのPull/Push時に証明書エラーが発生します。
- Enter CA cert bundle to use when calling S3 API (optional)は、Python Certifiのパスを設定しています。
:::

- 最後にNetApp DataOps Toolkitを使って、Amazon S3からデータをダウンロードしてみます。

```bash
$ netapp_dataops_cli.py pull-from-s3 bucket -b tsukioka-hogehoge-bucket001 -p test/test -d /test
Downloading object 'test/test.file' from bucket 'tsukioka-hogehoge-bucket001' and saving as '/test/test/test.file'.
Downloading object 'test/test_2.file' from bucket 'tsukioka-hogehoge-bucket001' and saving as '/test/test/test_2.file'.
Download complete.

$ ls -la
合計 2097164
drwxrwxr-x  2 jupyter jupyter         58  8月 23 17:34 .
drwx------ 10 jupyter jupyter        324  8月 23 17:31 ..
-rw-rw-r--  1 jupyter jupyter 1073741824  8月 23 17:34 test.file
-rw-rw-r--  1 jupyter jupyter 1073741824  8月 23 17:34 test_2.file
```
　無事に2つのファイルをダウンロードすることができました。
　NetApp DataOps ToolkitのConfigでS3 Access Key ID / S3 Secret Access Keyを省力しているので、
　IAM Roles Anywhereで取得した認証情報を使って、Amazon S3へアクセスできたことになります。


# まとめ
今回は、IAM Roles Anywhereで取得した認証情報をもとにNetApp DataOps Toolkitを使ったAmazon S3からのデータダウンロードについて検証してみました。
オンプレミスのサーバーまたはクライアント上でNetApp DataOps Toolkitを使ったNetApp ONTAPストレージの管理をしつつ、Amazon S3の操作（データのPut/Get）を実現したい際に参考となる内容をお届けできたかと思います。
この記事が少しでも参考になれば、幸いです。

IAM Roles Anywhereの設定方法は、主な参照元にリンクを記載しているClassmethod様とServerworks様のブログが大変参考になりましたので、本記事と合わせてご確認いただければと思います。

# 主な参照元
- https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html
- https://dev.classmethod.jp/articles/iam-roles-anywhere-with-aws-pca/
- https://blog.serverworks.co.jp/iam_roles_anywhere_try
- https://github.com/NetApp/netapp-dataops-toolkit/tree/main/netapp_dataops_traditional