3
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-08-28

本記事の要約

  • 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で実現する機械学習基盤」の記事はこちら

何故、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
Amazon S3との接続時にシークレットキーとアクセスキーを安易に使うとキー漏洩時のことやキーのローテーションなど運用面での考慮が必要になるので、今回はIAM Roles Anywhereを利用してみるということです。

やってみた

今回の検証イメージです。
image.png

  • 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で認証局を作成します。
    image.png

  • プライベート認証機関(CA)を作成する画面で、モード「有効期間の短い証明書」を選択します。
    image.png

  • サブジェクトの識別名を入力します。
    image.png

  • キーアルゴリズムを選択します。(今回は、RSA 2048を選択しました)
    image.png

  • 画面最下部の「料金」にチェックを入れ、「CAを作成」をクリックします。
    image.png

  • 認証局が作成されたことを確認します。
    image.png

  • 作成された認証局を選択し、アクションタブから「CA証明書をインストール」をクリックします。
    image.png

  • 有効期限を確認し、「確認してインストール」をクリックします。
    なお、デフォルトの有効期限は10年になり、伸ばすこともできます。
    image.png

  • 認証局のステータスがアクティブになったことを確認します。
    image.png

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

  • 続いて、CloudShellを起動します。
    image.png

  • オンプレミスで作成した署名リクエスト(csr.pem)をCloudShell上に作成します。
    image.png

  • 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を配置します。
    image.png

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

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

image.png

 カスタム信頼ポリシーの中身は以下のように定義しました。

{
    "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

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

  • 信頼アンカーを作成します。
    image.png

  • アンカー名とプライベートCAを選択し、信頼アンカーを作成します。
    image.png

  • 信頼アンカーが作成されたことを確認します。
    image.png

  • プロファイルを作成します。
    image.png

  • プロファイル名と前段の手順で作成したIAMロールを設定し、プロファイルを作成します。
    image.png

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

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

オンプレミスのサーバーにaws_signing_helperを導入し、IAM Roles Anywhereを使ってみる。

$ 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様のブログが大変参考になりましたので、本記事と合わせてご確認いただければと思います。

主な参照元

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0