本記事の要約
-
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外で利用することを想定)
以前投稿した「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接続のためのアクセスキー/シークレットキーのクレデンシャル情報を入力しています。
Amazon S3との接続時にシークレットキーとアクセスキーを安易に使うとキー漏洩時のことやキーのローテーションなど運用面での考慮が必要になるので、今回はIAM Roles Anywhereを利用してみるということです。
やってみた
- IAM Roles Anywhereを利用できる環境を作成し、オンプレミスに準備したサーバーへaws_signing_helperをインストールする。
- IAM Roles Anywherの準備が完了した後、NetApp DataOps Toolkitをインストールし、Config設定でクレデンシャル情報を省略した上でAmazon S3からデータをダウンロードしてみる。
IAM Roles Anywhereの構築
- まずオンプレミスのサーバーで秘密鍵と署名リクエスト(CSR)を作成します。
$ 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)を確認します。
$ 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で認証局を作成します。
-
有効期限を確認し、「確認してインストール」をクリックします。
なお、デフォルトの有効期限は10年になり、伸ばすこともできます。
後続の作業で利用しますので、作成された認証局のARNを控えておくことをお勧めします。
-
CloudShell上でエンドエンティティ証明書を発行します。
「--certificate-authority-arn」の中身を、認証局(Private CA (Short-Liveモード) )の ARN に置き換えてください。暗号化方式は 認証局 の作成時に選んだ RSA (SHA256WITHRSA)にしています。
有効期間は、Short-Live モードの最長である7日にしました。
$ 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”
後続の作業で利用しますので、コマンドで出力されたエンドエンティティ証明書のARN(CertificateArn)を控えておくことをお勧めします。
- エンドエンティティ証明書をcert.pemファイルに書き込みます。
「--certificate-authority-arn」は認証局(Private CA (Short-Liveモード) )の ARN です。
「--certificate-arn」は、エンドエンティティ証明書の ARN (上で控えたもの)です。
$ 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を配置します。
-
続いて、AWSマネジメントコンソールからIAMロールの作成を行います。
カスタム信頼ポリシーを設定し、認証に利用するエンドエンティティ証明書のIssuer/SubjectのCNとOUの値がCondition句に定義した値と一致した場合にIAMロールを引き受けるように設定します。
Condition句を定義しないと、信頼アンカーに登録している証明書であれば、どの証明書でもIAMロールを引き受けることができてしまいます。
カスタム信頼ポリシーの中身は以下のように定義しました。
{
"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の項目があることを確認し、「管理」をクリックします。
Roles Anywhereの画面に遷移した際、選択されているリージョンに注意してください。
IAMはグローバルサービスですが、IAM Roles Anywhereはリージョンサービスとなるため、認証局と同じリージョンで設定する必要があります。
後続の作業で利用しますので、作成した信頼アンカーとプロファイルの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
$ 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を使います。
$ ./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
- コマンドを実行します。(出力結果は、サンプルです)
$ ./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"}
- 取得できた認証情報を環境変数に登録します。
$ export AWS_ACCESS_KEY_ID="取得したアクセスキー"
$ export AWS_SECRET_ACCESS_KEY="取得したシークレットキー"
$ export AWS_SESSION_TOKEN="取得したセッショントークン"
- 試しにs3 lsコマンドが実行できるか確認してみます。(出力結果は、サンプルです)
$ 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をインストールします。
$ 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がインストールされたか確認します。
$ 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.
Data Fabric Commands:の欄にあるようにS3へデータをPull/Pushするコマンドが利用できます。
- NetApp DataOps ToolkitのConfigを設定します。
$ 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’.
- 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からデータをダウンロードしてみます。
$ 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様のブログが大変参考になりましたので、本記事と合わせてご確認いただければと思います。