1.1.2.3. Pythonスクリプトの準備をする

本書中の設定値の「< >」の表記については、ご利用の環境により各自入力いただく箇所となります("<"から">"までを設定値に置き換えてください)。
各コマンドの実行については、rootユーザーに昇格して実行する前提で記載しています。

各種パッケージや関連モジュールをインストールする

  1. 以下のコマンドを実行し、「Python」をインストールします。

    注釈

    • デフォルトでインストールされている「python36」は、後述する「boto3」のサポート対象外となっているため最新バージョンをインストールする必要があります。
    # yum install python39
    
  2. 以下のコマンドを実行し、「Python」がインストールされていることを確認します(本項記載時の「Python」のバージョンは"3.9.13"です)。
    # python3.9 --version
    
    Python 3.9.13
    
  3. 以下のコマンドを実行し、「pip」のインストールに必要なファイルをダウンロードします。
    # curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    
  4. 以下のコマンドを実行し、「pip」をインストールします。
    # python3.9 get-pip.py
    
  5. 以下のコマンドを実行し、「pip」がインストールされていることを確認します。(本項記載時の「pip」のバージョンは"23.1.2"です)。
    # pip --version
    
    pip 23.1.2 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)
    
  6. 以下のコマンドを実行し、「boto3」をインストールします。
    # pip install boto3
    
  7. 以下のコマンドを実行し、「boto3」がインストールされていることを確認します。(本項記載時の「boto3」のバージョンは"1.26.135"です)。
    # pip list | grep boto3
    
    boto3   1.26.135
    

スクリプトを作成する

下記の「表: Pythonスクリプト一覧」に記載のスクリプトを作成します。

表: Pythonスクリプト一覧
名称 説明
/usr/local/sbin/wasabi/vars_wasabi.py Wasabiの構築に必要な情報を変数として定義します。
/usr/local/sbin/wasabi/wasabi-iam-create.py WasabiのIAMユーザーとIAMポリシーを作成します。
/usr/local/sbin/wasabi/wasabi-bucket-create.py Wasabiのバケットとバケットポリシーを作成します。

注釈

  1. 以下のコマンドを実行し、「vars_wasabi.py」を作成します。

    注釈

    # cd /usr/local/sbin/wasabi
    # touch vars_wasabi.py
    # chmod 600 vars_wasabi.py
    # vi vars_wasabi.py
    
    accsess_key = "<Wasabi 既存ユーザーのアクセスキー>"
    secret_key = "<Wasabi 既存ユーザーのシークレットキー>"
    iam_user_name = "<Wasabi 新規IAMユーザー名>"
    iam_user_password = "<Wasabi 新規IAMユーザーのパスワード>"
    iam_policy_name="<Wasabi 新規IAMポリシー名>"
    bucket_endpoint = "s3.ap-northeast-1-ntt.wasabisys.com"
    bucket_name = "<Wasabi 新規バケット名>"
    
  2. 以下のコマンドを実行し、「wasabi-iam-create.py」を作成します。
    # touch wasabi-iam-create.py
    # chmod 600 wasabi-iam-create.py
    # vi wasabi-iam-create.py
    
    import boto3
    import json
    import vars_wasabi as wasabi
    
    
    # 変数の定義
    access_key = wasabi.accsess_key
    secret_key = wasabi.secret_key
    iam_user_name = wasabi.iam_user_name
    iam_user_password = wasabi.iam_user_password
    iam_policy_name = wasabi.iam_policy_name
    bucket_name = wasabi.bucket_name
    
    
    # IAMエンドポイントへの接続
    iam = boto3.client("iam",
             endpoint_url = "https://iam.wasabisys.com",
             aws_access_key_id = access_key,
             aws_secret_access_key = secret_key,
             region_name = "us-east-1"
    )
    
    
    # IAMユーザーの作成
    print("IAMユーザー「" + iam_user_name + "」を作成します。\n")
    response_user = iam.create_user(UserName = iam_user_name)
    print(response_user,"\n")
    
    
    # IAMユーザーのパスワード作成
    print("IAMユーザー「" + iam_user_name + "」のパスワードを作成します。\n")
    response_password = iam.create_login_profile(
        UserName = iam_user_name,
        Password = iam_user_password,
        PasswordResetRequired = False
    )
    print(response_password,"\n")
    
    
    # IAMユーザーのアクセスキー作成
    print("IAMユーザー「" + iam_user_name + "」のアクセスキーを作成します。")
    print("※払いだされたキー情報は出力結果の「AccessKeyId」「SecretAccessKey」を確認してください。\n")
    response_key = iam.create_access_key(UserName = iam_user_name)
    print(response_key,"\n")
    
    
    # IAMポリシーの作成
    print("IAMポリシー「" + iam_policy_name + "」を作成します。\n")
    policy_doc = {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "s3:ListAllMyBuckets",
          "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation"
          ],
          "Resource": "arn:aws:s3:::" + bucket_name
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject",
            "s3:GetObject"
          ],
          "Resource": "arn:aws:s3:::" + bucket_name + "/*"
        }
      ]
    }
    
    response_policy = iam.create_policy(
        PolicyName = iam_policy_name,
        PolicyDocument = json.dumps(policy_doc)
    )
    print(response_policy,"\n")
    
    
    # IAMポリシーの割り当て
    print("IAMユーザー「"+iam_user_name + "」にIAMポリシー「" + iam_policy_name + "」を割り当てます。\n")
    response_attach = iam.attach_user_policy(
        UserName = iam_user_name,
        PolicyArn = "arn:aws:iam:::policy/" + iam_policy_name
    )
    print(response_attach,"\n")
    
  3. 以下のコマンドを実行し、「wasabi-bucket-create.py」を作成します。

    注釈

    • 「Wasabiバケットへアクセスする際の通信元IPアドレス/XX」については、FIC-NATのグローバルIPアドレス、ICGWのグローバルIPアドレスを記載します。
      また、必要に応じて、インターネット経由でWasabiコンソールからバケットへアクセスする際のグローバルIPアドレスを記載します。
    • FIC-NATのグローバルIPアドレスについては、「Wasabiオブジェクトストレージの設定をする」の「wasabi-bucket-create.py」実行前に、「Flexible InterConnectの設定をする」の「ficrouter-snat-activate.sh」の実行結果の値を引用する必要があります。
      ICGWのグローバルIPアドレスの確認方法については、「よくある質問」をご参照ください。
    # touch wasabi-bucket-create.py
    # chmod 600 wasabi-bucket-create.py
    # vi wasabi-bucket-create.py
    
    import boto3
    import json
    import vars_wasabi as wasabi
    
    
    # 変数の定義
    access_key = wasabi.accsess_key
    secret_key = wasabi.secret_key
    bucket_endpoint = wasabi.bucket_endpoint
    bucket_name = wasabi.bucket_name
    
    
    # S3エンドポイントへの接続
    s3 = boto3.client("s3",
            endpoint_url = "https://" + bucket_endpoint,
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
    )
    
    
    #バケットの作成
    print("バケット名「" + bucket_name + "」を作成します。\n")
    response_bucket = s3.create_bucket(Bucket = bucket_name)
    print(response_bucket,"\n")
    
    
    #バケットのポリシー適用
    print("バケット名「" + bucket_name + "」にポリシーを適用します。\n")
    bucket_policy = {
            "Version": "2012-10-17",
            "Statement": [{
                    "Effect": "Deny",
                    "Principal": "*",
                    "Action": "*",
                    "Resource": [
                            "arn:aws:s3:::" + bucket_name,
                            "arn:aws:s3:::" + bucket_name + "/*"
                    ],
                    "Condition": {
                            "NotIpAddress": {
                                    "aws:SourceIp": [
                                            "<Wasabiバケットへアクセスする際の通信元IPアドレス/XX>",
                                            "<Wasabiバケットへアクセスする際の通信元IPアドレス/XX>",
                                            "<Wasabiバケットへアクセスする際の通信元IPアドレス/XX>"
                                    ]
                            }
                    }
            }]
    }
    bucket_policy = json.dumps(bucket_policy)
    response_policy = s3.put_bucket_policy(Bucket = bucket_name, Policy = bucket_policy)
    print(response_policy,"\n")