CLOUD NAVIクラウドとは?からクラウドを支える技術や関連用語まで解説

FJcloud実践

オブジェクトストレージサービス用APIの利用方法を解説

2022年06月27日

この記事は、ニフクラブログで2022-06-27に公開された記事を移転したものです。

こんにちは、CRE部 技術支援チームです。

ニフクラのオブジェクトストレージは、2022年 4月に ニフクラオブジェクトストレージサービスという名称リニューアルして、より堅牢性や安心・安全のセキュリティを備えたストレージサービスとして刷新されました。

ニフクラではニフクラオブジェクトストレージサービスを操作するためにニフクラオブジェクトストレージサービス用APIを提供しています。

今回、PythonとBashのサンプルプログラムを使用してニフクラオブジェクトストレージサービス用APIの基本的な操作を紹介したいと思います。

構成イメージ

ニフクラ上に構築した検証サーバーに外部からSSH接続後、検証サーバー上のAPIプログラム(Python、Bash)を実行して ニフクラオブジェクトストレージサービスを操作します。

前提条件

本ブログ記事は、以下の前提知識がある方を想定しています。

  • ニフクラの基本的な操作と知識
  • Python、Bashでの開発経験、WebAPIを操作した経験

ニフクラリソース

検証に利用したリソースは以下の通りです。

プログラム動作環境

項目
Python 3.9.7
Bash 4.4.20

検証概要

シグネチャーはシグネチャーバージョン 4 生成方法に従って生成します。

シグネチャー生成の詳細な解説は他ブログに掲載されていますので、そちらを参照してください。 * シグネチャー生成で使用される共通定数、共通関数は共通クラスで定義しています。

※サンプルプログラムのACCESS_KEY、SECRET_KEYの値についてはオブジェクトストレージサービス:アカウント詳細 で確認したアクセスキー、シークレットキーの値を設定してください。

※Bash側のyamlファイルの読み込み処理は信頼度、操作性、検証工程の短縮を考慮してPythonの機能を使用することにしました。

NifclaObstCommon.py(Python共通クラス)

import yaml, json, hashlib, hmac, base64

# 定数
SERVICE = 's3'
HOST = 'jp-east-1.storage.api.nifcloud.com'
REGION = 'east-1'
ENDPOINT = 'https://jp-east-1.storage.api.nifcloud.com'
ALGORITHM = 'AWS4-HMAC-SHA256'
ACCESS_KEY = 'XXXXXXXXXXXXXXXXXXXXX'
SECRET_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

# sha256ハッシュ化関数
def getHashCode(msg):
    return hashlib.sha256((msg).encode('utf-8')).hexdigest()

# MD5ハッシュ化base64エンコード関数
def getHashCodeMD5(msg):
    return base64.b64encode(hashlib.md5((msg).encode('utf-8')).digest())

# HMAC-SHA256ハッシュ化関数
def sign(key, msg):
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()

# 署名キー作成関数
def getSignatureKey(key, dateStamp, regionName, serviceName):
    kDate = sign(('AWS4' + key).encode('utf-8'), dateStamp)
    kRegion = sign(kDate, regionName)
    kService = sign(kRegion, serviceName)
    kSigning = sign(kService, 'aws4_request')
    return kSigning

# シグネチャ作成関数
def getSignature(signing_key,string_to_sign):
    return hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest()

# Yamlファイル読み込み関数
def loadYamlToString(filepath):
    with open('./policy/policy.yaml') as file:
     # yamlファイルロード
     obj = yaml.safe_load(file)
     # JSON文字列変換
     return json.dumps(obj)

# Yamlファイル読み込み関数Bash用
def loadYamlToStringForBash(filepath):
    with open(filepath) as file:
     # YAMLから辞書
     obj = yaml.safe_load(file)
     # 辞書からJSON文字列
     print(json.dumps(obj))

nifclaobst_common.sh(Bash共通クラス)

#!/bin/bash
# 定数
readonly LF=$'\n'
readonly SERVICE='s3'
readonly HOST='jp-east-1.storage.api.nifcloud.com'
readonly REGION='east-1'
readonly ENDPOINT='https://jp-east-1.storage.api.nifcloud.com'
readonly ALGORITHM='AWS4-HMAC-SHA256'
readonly ACCESS_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXX'
readonly SECRET_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

# sha256ハッシュ化関数
function get_hash_code () {
    echo -n "$1" | openssl dgst -sha256  2>/dev/null | sed 's/^.* //'
}

# MD5ハッシュ化base64エンコード関数
function get_hash_code_md5 () {
    echo -n "$1" | openssl dgst -md5  2>/dev/null  |  sed 's/^.* //'  | xxd -r -p | base64
}

# HMAC-SHA256ハッシュ化関数(キーがstring文字列key)
function sign () {
    echo -n "$2" | openssl dgst -sha256 -mac HMAC -macopt key:"$1" | grep stdin | awk '{print $2}'
}
# HMAC-SHA256ハッシュ化関数(キーが16進数hexkey)
function sign_hexkey () {
    echo -n "$2" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$1" | grep stdin | awk '{print $2}'
}

# 署名キー作成関数
function get_signature_key () {
    kDate=`sign AWS4$1 $2`
    kRegion=`sign_hexkey $kDate $3`
    kService=`sign_hexkey $kRegion $4`
    sign_hexkey $kService 'aws4_request'
}

# シグネチャ作成関数
function get_signature () {
    sign_hexkey "$1" "$2"
}
# yamlファイル読み込み(Python共通クラスから読み込み)関数
function load_yaml_to_string() {
    # '../xxxpython'パスはPython共通クラスを配置している場所
    python -c "import sys; sys.path.append('../xxxpython'); import NifclaObstCommon; NifclaObstCommon.loadYamlToStringForBash('$1')"
}

Python動作環境設定

**※ニフクラのサーバーOSはRockylinux 8.5での動作環境設定方法を記述します。

ニフクラのサーバーOSはRockylinux 8.5以外での動作環境設定は環境状況に各自で従って設定してください。**

  • ニフクラでRockylinux 8.5のサーバー作成直後はPythonコマンドを実行しても以下のように表示されて動作しないので、Pythonのインストール、動作環境の設定をおこないます。
# python -V
-bash: python: command not found
  • 以下のコマンドでPython3.9をインストールします。
# dnf install python39
# dnf install python39
Rocky Linux 8 - AppStream                       5.7 MB/s | 8.4 MB     00:01
Rocky Linux 8 - BaseOS                          5.6 MB/s | 2.6 MB     00:00
Rocky Linux 8 - Extras                           13 kB/s |  11 kB     00:00
Dependencies resolved.

-----省略-----

Installed:
  python39-3.9.7-1.module+el8.6.0+795+de4edbcc.x86_64
  python39-libs-3.9.7-1.module+el8.6.0+795+de4edbcc.x86_64
  python39-pip-20.2.4-7.module+el8.6.0+795+de4edbcc.noarch
  python39-pip-wheel-20.2.4-7.module+el8.6.0+795+de4edbcc.noarch
  python39-setuptools-50.3.2-4.module+el8.5.0+673+10283621.noarch
  python39-setuptools-wheel-50.3.2-4.module+el8.5.0+673+10283621.noarch

Complete!

インストールが成功します。

  • システムで使用するPythonのバージョンを以下のコマンドで切り替えます。
# alternatives --config python

以下のような内容が表示されます。「python3.9」を選択します。

※例の場合は'3'を選択します。

# alternatives --config python

There are 3 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/libexec/no-python
   2           /usr/bin/python3
   3           /usr/bin/python3.9

Enter to keep the current selection[+], or type selection number:
  • 以下のコマンドでPythonのバージョンを確認します。
# python -V
# python -V
Python 3.9.7

Pythonのバージョンが3.9.7に切り替わっています。動作環境設定は完了です。

検証実施Python

1. バケット一覧取得

バケット一覧を取得してバケット作成前の状態を確認します。

NifclaObstGetService.py(バケット一覧取得処理)

import sys, requests,datetime,NifclaObstCommon


# タイムスタンプ取得&編集
## タイムスタンプ取得
utcdate = datetime.datetime.utcnow()
## ヘッダ用
amzdate = utcdate.strftime('%Y%m%dT%H%M%SZ')
## CredentialScope用
datestamp = utcdate.strftime('%Y%m%d')

# シグネチャ作成
## リクエストメソッド
method = 'GET'
## ヘッダパラメータ
signed_headers = 'host;x-amz-content-sha256;x-amz-date'
## パスパラメータ
canonical_uri = '/'
## リクエストクエリパラメータ
canonical_querystring = ''
## リクエストボディ
request_parameters = ''
## ペイロード作成
payload_hash = NifclaObstCommon.getHashCode(request_parameters)
## CanonicalHeaders作成
canonical_headers = 'host:' + NifclaObstCommon.HOST + '\n' + 'x-amz-content-sha256:' + payload_hash + '\n' + 'x-amz-date:' + amzdate + '\n'
## CanonicalRequest作成
canonical_request = method  + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
## CredentialScope作成
credential_scope = datestamp + '/' + NifclaObstCommon.REGION + '/' + NifclaObstCommon.SERVICE + '/' + 'aws4_request'
## 署名文字列作成
string_to_sign = NifclaObstCommon.ALGORITHM + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  NifclaObstCommon.getHashCode(canonical_request)
## 署名キー作成
signing_key = NifclaObstCommon.getSignatureKey(NifclaObstCommon.SECRET_KEY, datestamp, NifclaObstCommon.REGION, NifclaObstCommon.SERVICE)
## シグネチャ生成
signature = NifclaObstCommon.getSignature(signing_key, string_to_sign)

# リクエスト作成
## Authorizationヘッダ作成
authorization_header = NifclaObstCommon.ALGORITHM + ' ' + 'Credential=' + NifclaObstCommon.ACCESS_KEY + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
## リクエストヘッダ作成
headers = {'x-amz-content-sha256':payload_hash,
           'x-amz-date':amzdate, 
           'Authorization':authorization_header}
## リクエストURL作成
request_url = NifclaObstCommon.ENDPOINT + canonical_uri + '?' + canonical_querystring

# リクエスト送信
print('Request URL = ' + request_url)
print('Send --->')
req = requests.get(request_url, headers=headers)

# レスポンス受信
print('Receive <---')
print('Response code: %d\n' % req.status_code)
print(req.text)

2. パケット作成

パケットを作成します。

NifclaObstBucket.py(バケット作成処理)


    import sys, requests, datetime, NifclaObstCommon

    # 引数格納
    ## バケット名
    bucket_name = sys.argv[1]
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate = datetime.datetime.utcnow()
    ## ヘッダ用
    amzdate = utcdate.strftime('%Y%m%dT%H%M%SZ')
    ## CredentialScope用
    datestamp = utcdate.strftime('%Y%m%d')
    
    # シグネチャ作成
    ## リクエストメソッド
    method = 'PUT'
    ## ヘッダパラメータ
    signed_headers = 'host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri = '/' + bucket_name
    ## リクエストクエリパラメータ
    canonical_querystring = ''
    ## リクエストボディ
    request_parameters = ''
    ## ペイロード作成
    payload_hash = NifclaObstCommon.getHashCode(request_parameters)
    ## CanonicalHeaders作成
    canonical_headers = 'host:' + NifclaObstCommon.HOST + '\n' + 'x-amz-content-sha256:' + payload_hash + '\n' + 'x-amz-date:' + amzdate + '\n'
    ## CanonicalRequest作成
    canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
    ## CredentialScope作成
    credential_scope = datestamp + '/' + NifclaObstCommon.REGION + '/' + NifclaObstCommon.SERVICE + '/' + 'aws4_request'
    ## 署名文字列作成
    string_to_sign = NifclaObstCommon.ALGORITHM + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  NifclaObstCommon.getHashCode(canonical_request)
    ## 署名キー作成
    signing_key = NifclaObstCommon.getSignatureKey(NifclaObstCommon.SECRET_KEY, datestamp, NifclaObstCommon.REGION, NifclaObstCommon.SERVICE)
    ## シグネチャ生成
    signature = NifclaObstCommon.getSignature(signing_key, string_to_sign)
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header = NifclaObstCommon.ALGORITHM + ' ' + 'Credential=' + NifclaObstCommon.ACCESS_KEY + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
    ## リクエストヘッダ作成
    headers = {'x-amz-content-sha256':payload_hash,
               'x-amz-date':amzdate, 
               'Authorization':authorization_header}
    ## リクエストURL作成
    request_url = NifclaObstCommon.ENDPOINT + canonical_uri
    
    # リクエスト送信
    print('Request URL = ' + request_url)
    print('Send --->')
    req = requests.put(request_url, headers=headers)
    
    # レスポンス受信
    print('Receive <---')
    print('Response code: %d\n' % req.status_code)
    print(req.text)

バケット作成実行
パラメータにバケット名:「new-object-apitest」を設定してバケット作成処理を実行します。作成成功の応答が返却されます。


    # python NifclaObstPutBucket.py new-object-apitest
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest
    Send --->
    Receive <---
    Response code: 200

バケット一覧取得
バケットが作成されたことを確認するためバケット一覧取得を実行します。作成後のバケット一覧の内容が返却されます。
バケット名:「new-object-apitest」が作成されています。


    # python NifclaObstGetService.py
    Request URL = https://jp-east-1.storage.api.nifcloud.com/?
    Send --->
    Receive <---
    Response code: 200
    
    <?xml version="1.0" encoding="UTF-8"?>
    <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>XXXXXXXXXXXXXXXX</ID><DisplayName>XXXXXXXXXXXXXXX/XXXXXXXXXXXXXXX</DisplayName></Owner><Buckets><Bucket><Name>multibk-db-dump</Name><CreationDate>2022-05-10T07:01:28.005Z</CreationDate></Bucket><Bucket><Name>new-object-apitest</Name><CreationDate>2022-06-07T04:10:20.640Z</CreationDate></Bucket></Buckets></ListAllMyBucketsResult>

3. バケット権限ポリシー取得

バケット権限ポリシー設定を取得します。

NifclaObstGetPolicy.py(バケット権限ポリシー取得処理)


    import sys, requests,datetime,NifclaObstCommon

    # 引数格納
    ## バケット名
    bucket_name = sys.argv[1]
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate = datetime.datetime.utcnow()
    ## ヘッダ用
    amzdate = utcdate.strftime('%Y%m%dT%H%M%SZ')
    ## CredentialScope用
    datestamp = utcdate.strftime('%Y%m%d')
    
    # シグネチャ作成
    ## リクエストメソッド
    method = 'GET'
    ## ヘッダパラメータ
    signed_headers = 'host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri =  '/' + bucket_name
    ## リクエストクエリパラメータ
    canonical_querystring = 'policy='
    ## リクエストボディ
    request_parameters = ''
    ## ペイロード作成
    payload_hash = NifclaObstCommon.getHashCode(request_parameters)
    ## CanonicalHeaders作成
    canonical_headers = 'host:' + NifclaObstCommon.HOST + '\n' + 'x-amz-content-sha256:' + payload_hash + '\n' + 'x-amz-date:' + amzdate + '\n'
    ## CanonicalRequest作成
    canonical_request = method  + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
    ## CredentialScope作成
    credential_scope = datestamp + '/' + NifclaObstCommon.REGION + '/' + NifclaObstCommon.SERVICE + '/' + 'aws4_request'
    ## 署名文字列作成
    string_to_sign = NifclaObstCommon.ALGORITHM + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  NifclaObstCommon.getHashCode(canonical_request)
    ## 署名キー作成
    signing_key = NifclaObstCommon.getSignatureKey(NifclaObstCommon.SECRET_KEY, datestamp, NifclaObstCommon.REGION, NifclaObstCommon.SERVICE)
    ## シグネチャ生成
    signature = NifclaObstCommon.getSignature(signing_key, string_to_sign)
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header = NifclaObstCommon.ALGORITHM + ' ' + 'Credential=' + NifclaObstCommon.ACCESS_KEY + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
    ## リクエストヘッダ作成
    headers = {'x-amz-content-sha256':payload_hash,
               'x-amz-date':amzdate, 
               'Authorization':authorization_header}
    ## リクエストURL作成
    request_url = NifclaObstCommon.ENDPOINT + canonical_uri + '?' + canonical_querystring
    
    # リクエスト送信
    print('Request URL = ' + request_url)
    print('Send --->')
    req = requests.get(request_url, headers=headers)
    
    # レスポンス受信
    print('Receive <---')
    print('Response code: %d\n' % req.status_code)
    print(req.text)

バケット権限ポリシー取得
パラメータにバケット名:「new-object-apitest」を設定してバケット権限ポリシー取得処理を実行します。権限ポリシーの応答が返却されます。
バケット作成直後は権限ポリシーが設定されていないのでエラー応答が返却されます。
※作成直後のバケットは、作成者のみフルアクセス権限が設定されているだけです。


    # python NifclaObstGetPolicy.py new-object-apitest
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest?policy=
    Send --->
    Receive <---
    Response code: 404
    
    <?xml version="1.0" encoding="UTF-8"?>
    <Error><Code>NoSuchBucketPolicy</Code><Message>The specified bucket does not have a bucket policy.</Message><Resource>/new-object-apitest?policy=</Resource><RequestId>1654576016408214</RequestId></Error>

4. バケット権限ポリシー設定

バケットに権限ポリシーを設定します。 バケットの運用計画(他ユーザに閲覧権限、編集権限を付与する等)に沿った内容を設定します。
詳細についてはAPIリファレンス:PutBucketPolicyを参照してください。

※サンプルプログラムではポリシー名: "NifclaTestPolicy"でユーザ2名にバケット全権許可する設定内容になっています。
「urn:sgws:identity::xxxxxxxxxxxxxxxxxxxxxxx:user/xxxxxxxxx 」
の箇所はユーザ情報を設定します。
「urn:sgws:identity::<テナントID>:user/<大文字ニフクラID>」
を設定してください。

NifclaObstPutPolicy.py(バケット権限ポリシー設定処理)


    import sys, requests, datetime, base64, NifclaObstCommon
    # 引数格納
    ## バケット名
    bucket_name = sys.argv[1]
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate = datetime.datetime.utcnow()
    ## ヘッダ用
    amzdate = utcdate.strftime('%Y%m%dT%H%M%SZ')
    ## CredentialScope用
    datestamp = utcdate.strftime('%Y%m%d')
    
    # シグネチャ作成
    ## リクエストメソッド
    method = 'PUT'
    ## 署名ヘッダパラメーター
    signed_headers = 'content-md5;host;x-amz-content-sha256;x-amz-date'
    ## パスパラメーター
    canonical_uri =  '/' + bucket_name
    ## リクエストクエリパラメーター
    canonical_querystring = 'policy='
    ## リクエストボディ
    request_parameters =  '{'
    request_parameters +=   '"Statement": ['
    request_parameters +=    '{'
    request_parameters +=      '"Sid": "NifclaTestPolicy",'
    request_parameters +=      '"Effect": "Allow",'
    request_parameters +=      '"Principal": {'
    request_parameters +=        '"SGWS": '
    request_parameters +=        '  ['
    request_parameters +=        '   "urn:sgws:identity::xxxxxxxxxxxxxxxxxxxxxxx:user/xxxxxxxxx",'
    request_parameters +=        '   "urn:sgws:identity::xxxxxxxxxxxxxxxxxxxxxxx:user/xxxxxxxxx"'
    request_parameters +=        '  ]'
    request_parameters +=      '},'
    request_parameters +=      '"Action": "s3:*",'
    request_parameters +=      '"Resource": "urn:sgws:s3:::' + bucket_name + '/*"'
    request_parameters +=    '}'
    request_parameters +=   ']'
    request_parameters +=  '}'
    ## リクエストcontent-md5
    content_md5 = str(NifclaObstCommon.getHashCodeMD5(request_parameters), encoding='utf-8')
    ## ペイロード作成
    payload_hash = NifclaObstCommon.getHashCode(request_parameters)
    ## CanonicalHeaders作成
    canonical_headers = 'content-md5:' + content_md5 + '\n' + 'host:' + NifclaObstCommon.HOST + '\n' + 'x-amz-content-sha256:' + payload_hash + '\n' + 'x-amz-date:' + amzdate + '\n'
    ## CanonicalRequest作成
    canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
    ## CredentialScope作成
    credential_scope = datestamp + '/' + NifclaObstCommon.REGION + '/' + NifclaObstCommon.SERVICE + '/' + 'aws4_request'
    ## 署名文字列作成
    string_to_sign = NifclaObstCommon.ALGORITHM + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  NifclaObstCommon.getHashCode(canonical_request)
    ## 署名キー作成
    signing_key = NifclaObstCommon.getSignatureKey(NifclaObstCommon.SECRET_KEY, datestamp, NifclaObstCommon.REGION, NifclaObstCommon.SERVICE)
    ## シグネチャ生成
    signature = NifclaObstCommon.getSignature(signing_key, string_to_sign)
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header = NifclaObstCommon.ALGORITHM + ' ' + 'Credential=' + NifclaObstCommon.ACCESS_KEY + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
    ## リクエストヘッダ作成
    headers = {'x-amz-content-sha256':payload_hash,
               'x-amz-date':amzdate, 
               'Authorization':authorization_header,
               'Content-MD5':content_md5}
    ## リクエストURL作成
    request_url = NifclaObstCommon.ENDPOINT + canonical_uri + '?' + canonical_querystring
    
    # リクエスト送信
    print('Request URL = ' + request_url)
    print('Send --->')
    req = requests.put(request_url, data=request_parameters, headers=headers)
    
    # レスポンス受信
    print('Receive <---')
    print('Response code: %d\n' % req.status_code)
    print(req.text)

バケット権限ポリシー設定実行
パラメータにバケット名:「new-object-apitest」を設定してバケット権限ポリシー設定処理を実行します。作成成功の応答が返却されます。


    # python NifclaObstPutPolicy.py new-object-apitest
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest?policy=
    Send --->
    Receive <---
    Response code: 204

バケット権限ポリシー取得
バケット権限ポリシーが作成されたことを確認するためバケット権限ポリシー取得を実行します。設定後の権限ポリシーの内容が返却されます。
権限ポリシー名:「NifclaTestPolicy」が作成されています。


    # python NifclaObstGetPolicy.py new-object-apitest
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest?policy=
    Send --->
    Receive <---
    Response code: 200
    
    {"Statement":[{"Sid":"NifclaTestPolicy","Effect":"Allow","Principal":{"SGWS":["urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX","urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX"]},"Action":"s3:*","Resource":"urn:sgws:s3:::new-object-apitest/*"}]}

5. バケット権限ポリシー設定yaml形式

上記4. バケット権限ポリシー設定をyamlファイルに外部化した場合の設定方法です。

※ディレクトリ:./policy配下にファイル名:policy.yamlを配置します。


    # cat ./policy/policy.yaml
    Statement:
      -
        Sid: NifclaTestPolicy
        Effect: Allow
        Principal:
          SGWS: 
               - 'urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX'
               - 'urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX'
        Action: 's3:*'
        Resource: 'urn:sgws:s3:::new-object-apitest/*'

NifclaObstPutPolicyYaml.py(バケット権限ポリシー設定処理※yamlファイル形式)


    import sys, requests, datetime, NifclaObstCommon

    # 引数格納
    ## バケット名
    bucket_name = sys.argv[1]
    ## policy設定ファイルパス
    policy_filepath = sys.argv[2]
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate = datetime.datetime.utcnow()
    ## ヘッダ用
    amzdate = utcdate.strftime('%Y%m%dT%H%M%SZ')
    ## CredentialScope用
    datestamp = utcdate.strftime('%Y%m%d')
    
    # シグネチャ作成
    ## リクエストメソッド
    method = 'PUT'
    ## ヘッダパラメーター
    signed_headers = 'content-md5;host;x-amz-content-sha256;x-amz-date'
    ## パスパラメーター
    canonical_uri =  '/' + bucket_name
    ## リクエストクエリパラメーター
    canonical_querystring = 'policy='
    ## リクエストボディ
    request_parameters =  NifclaObstCommon.loadYamlToString(policy_filepath)
    ## リクエストcontent-md5
    content_md5 = str(NifclaObstCommon.getHashCodeMD5(request_parameters), encoding='utf-8')
    ## ペイロード作成
    payload_hash = NifclaObstCommon.getHashCode(request_parameters)
    ## CanonicalHeaders作成
    canonical_headers = 'content-md5:' + content_md5 + '\n' + 'host:' + NifclaObstCommon.HOST + '\n' + 'x-amz-content-sha256:' + payload_hash + '\n' + 'x-amz-date:' + amzdate + '\n'
    ## CanonicalRequest作成
    canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
    ## CredentialScope作成
    credential_scope = datestamp + '/' + NifclaObstCommon.REGION + '/' + NifclaObstCommon.SERVICE + '/' + 'aws4_request'
    ## 署名文字列作成
    string_to_sign = NifclaObstCommon.ALGORITHM + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  NifclaObstCommon.getHashCode(canonical_request)
    ## 署名キー作成
    signing_key = NifclaObstCommon.getSignatureKey(NifclaObstCommon.SECRET_KEY, datestamp, NifclaObstCommon.REGION, NifclaObstCommon.SERVICE)
    ## シグネチャー生成
    signature = NifclaObstCommon.getSignature(signing_key, string_to_sign)
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header = NifclaObstCommon.ALGORITHM + ' ' + 'Credential=' + NifclaObstCommon.ACCESS_KEY + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
    ## リクエストヘッダ作成
    headers = {'x-amz-content-sha256':payload_hash,
               'x-amz-date':amzdate, 
               'Authorization':authorization_header,
               'Content-MD5':content_md5}
    ## リクエストURL作成
    request_url = NifclaObstCommon.ENDPOINT + canonical_uri + '?' + canonical_querystring
    
    # リクエスト送信
    print('Request URL = ' + request_url)
    print('Send --->')
    req = requests.put(request_url, data=request_parameters, headers=headers)
    
    # レスポンス受信
    print('Receive <---')
    print('Response code: %d\n' % req.status_code)
    print(req.text)
    バケット権限ポリシー設定実行
    パラメータにバケット名:「new-object-apitest」、yamlファイルパス:「./policy/policy.yaml」を設定してバケット権限ポリシー設定処理を実行します。作成成功の応答が返却されます。
    # python NifclaObstPutPolicyYaml.py new-object-apitest ./policy/policy.yaml
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest?policy=
    Send --->
    Receive <---
    Response code: 204

バケット権限ポリシー設定後確認
バケット権限ポリシーが作成されたことを確認するためバケット権限ポリシー取得を実行します。設定後の権限ポリシーの内容が返却されます。
権限ポリシー名:「NifclaTestPolicy」が作成されています。


    # python NifclaObstGetPolicy.py new-object-apitest
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest?policy=
    Send --->
    Receive <---
    Response code: 200
    
    {"Statement":[{"Sid":"NifclaTestPolicy","Effect":"Allow","Principal":{"SGWS":["urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX","urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX"]},"Action":"s3:*","Resource":"urn:sgws:s3:::new-object-apitest/*"}]}

6. バケット内オブジェクト一覧取得

バケット内オブジェクト一覧を取得してオブジェクトアップロード前の状態を確認します。

NifclaObstGetBucket.py(オブジェクト一覧取得処理)


    import sys, requests,datetime,NifclaObstCommon

    # 引数格納
    ## バケット名
    bucket_name = sys.argv[1]
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate = datetime.datetime.utcnow()
    ## ヘッダ用
    amzdate = utcdate.strftime('%Y%m%dT%H%M%SZ')
    ## CredentialScope用
    datestamp = utcdate.strftime('%Y%m%d')
    
    # シグネチャ作成
    ## リクエストメソッド
    method = 'GET'
    ## ヘッダパラメータ
    signed_headers = 'host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri =  '/' + bucket_name
    ## リクエストクエリパラメータ
    canonical_querystring = ''
    ## リクエストボディ
    request_parameters = ''
    ## ペイロード作成
    payload_hash = NifclaObstCommon.getHashCode(request_parameters)
    ## CanonicalHeaders作成
    canonical_headers = 'host:' + NifclaObstCommon.HOST + '\n' + 'x-amz-content-sha256:' + payload_hash + '\n' + 'x-amz-date:' + amzdate + '\n'
    ## CanonicalRequest作成
    canonical_request = method  + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
    ## CredentialScope作成
    credential_scope = datestamp + '/' + NifclaObstCommon.REGION + '/' + NifclaObstCommon.SERVICE + '/' + 'aws4_request'
    ## 署名文字列作成
    string_to_sign = NifclaObstCommon.ALGORITHM + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  NifclaObstCommon.getHashCode(canonical_request)
    ## 署名キー作成
    signing_key = NifclaObstCommon.getSignatureKey(NifclaObstCommon.SECRET_KEY, datestamp, NifclaObstCommon.REGION, NifclaObstCommon.SERVICE)
    ## シグネチャ生成
    signature = NifclaObstCommon.getSignature(signing_key, string_to_sign)
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header = NifclaObstCommon.ALGORITHM + ' ' + 'Credential=' + NifclaObstCommon.ACCESS_KEY + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
    ## リクエストヘッダ作成
    headers = {'x-amz-content-sha256':payload_hash,
               'x-amz-date':amzdate, 
               'Authorization':authorization_header}
    ## リクエストURL作成
    request_url = NifclaObstCommon.ENDPOINT + canonical_uri + '?' + canonical_querystring
    
    # リクエスト送信
    print('Request URL = ' + request_url)
    print('Send --->')
    req = requests.get(request_url, headers=headers)
    
    # レスポンス受信
    print('Receive <---')
    print('Response code: %d\n' % req.status_code)
    print(req.text)

バケット内オブジェクト一覧取得
パラメータにバケット名:「new-object-apitest」を設定してバケット内オブジェクト一覧取得処理を実行します。オブジェクトアップロード前のバケット内オブジェクト一覧の内容が返却されます。


    # python NifclaObstGetBucket.py new-object-apitest
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest?
    Send --->
    Receive <---
    Response code: 200
    
    <?xml version="1.0" encoding="UTF-8"?>
    <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>new-object-apitest</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated></ListBucketResult>

7. オブジェクトアップロード

オブジェクトをバケットにアップロードします。

NifclaObstPutObject.py(オブジェクトアップロード処理)


    import sys, os, requests, datetime, NifclaObstCommon

    # 引数格納
    ## バケット名
    bucket_name = sys.argv[1]
    ## アップロード先のオブジェクト名
    obj_name = sys.argv[2]
    ## アップロード元のオブジェクトパス
    local_obj_name = sys.argv[3]
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate = datetime.datetime.utcnow()
    ## ヘッダ用
    amzdate = utcdate.strftime('%Y%m%dT%H%M%SZ')
    ## CredentialScope用
    datestamp = utcdate.strftime('%Y%m%d')
    
    # シグネチャ作成
    ## リクエストメソッド
    method = 'PUT'
    ## リクエストcontent_length
    content_length = str(os.path.getsize(local_obj_name))
    ## リクエストcontent_type
    content_type = 'text/plain'
    ## 署名ヘッダパラメータ
    signed_headers = 'content-length;content-type;host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri =  '/' + bucket_name + '/' + obj_name
    ## リクエストクエリパラメータ
    canonical_querystring = ''
    ## リクエストボディ
    request_parameters = ''
    ## ペイロード作成
    payload_hash = NifclaObstCommon.getHashCode(request_parameters)
    ## CanonicalHeaders作成
    canonical_headers = 'content-length:' + content_length + '\n' + 'content-type:' + content_type + '\n' + 'host:' + NifclaObstCommon.HOST + '\n' + 'x-amz-content-sha256:' + payload_hash + '\n' + 'x-amz-date:' + amzdate + '\n' 
    ## CanonicalRequest作成
    canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
    ## CredentialScope作成
    credential_scope = datestamp + '/' + NifclaObstCommon.REGION + '/' + NifclaObstCommon.SERVICE + '/' + 'aws4_request'
    ## 署名文字列作成
    string_to_sign = NifclaObstCommon.ALGORITHM + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  NifclaObstCommon.getHashCode(canonical_request)
    ## 署名キー作成
    signing_key = NifclaObstCommon.getSignatureKey(NifclaObstCommon.SECRET_KEY, datestamp, NifclaObstCommon.REGION, NifclaObstCommon.SERVICE)
    ## シグネチャ生成
    signature = NifclaObstCommon.getSignature(signing_key, string_to_sign)
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header = NifclaObstCommon.ALGORITHM + ' ' + 'Credential=' + NifclaObstCommon.ACCESS_KEY + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
    ## リクエストヘッダ作成
    headers = {'x-amz-content-sha256':payload_hash,
               'x-amz-date':amzdate, 
               'Authorization':authorization_header,
               'Content-Length':content_length,
               'Content-Type':content_type}
    ## リクエストURL作成
    request_url = NifclaObstCommon.ENDPOINT + canonical_uri + '?' + canonical_querystring
    
    # リクエスト送信
    print('Request URL = ' + request_url)
    print('Send --->')
    req = requests.put(request_url, data=open(local_obj_name, 'rb').read(),headers=headers)
    
    # レスポンス受信
    print('Receive <---')
    print('Response code: %d\n' % req.status_code)
    print(req.text)

オブジェクトアップロード実行
以下の内容のファイルを指定したバケットにアップロードします。 ※ディレクトリ:./upload配下にファイル名:upload_data.txtを配置した場合


    # cat ./upload/upload_data.txt
    Nifcla Object Storage
    Testテスト試験
    Api Test Python

パラメータにバケット名:「new-object-apitest」、アップロードファイル名:「upload_pythondata.txt」、アップロード元ファイルパス:「./upload/upload_data.txt」を設定してオブジェクトアップロード処理を実行します。オブジェクトアップロード成功の応答が返却されます。


    # python NifclaObstPutObject.py new-object-apitest upload_pythondata.txt ./upload/upload_data.txt
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest/upload_pythondata.txt?
    Send --->
    Receive <---
    Response code: 200

バケット内オブジェクト一覧取得 オブジェクトがアップロードされたことを確認するためにバケット内オブジェクト一覧取得を実行します。 パラメータにバケット名:「new-object-apitest」を設定してバケット内オブジェクト一覧取得処理を実行します。オブジェクトアップロード後のオブジェクト一覧の内容が返却されます。
アップロードファイル名:「upload_pythondata.txt」がアップロードされています。


    # python NifclaObstGetBucket.py new-object-apitest
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest?
    Send --->
    Receive <---
    Response code: 200
    
    <?xml version="1.0" encoding="UTF-8"?>
    <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>new-object-apitest</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>upload_pythondata.txt</Key><LastModified>2022-06-07T05:39:40.714Z</LastModified><ETag>"caddfb129e92567c7685b4654b4f8b90"</ETag><Size>58</Size><Owner><ID>36975684642969982275</ID><DisplayName>sFcwSYdQ/6d454ab4873f49b0a43a168ad65c0ded/nct-bct46334</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>

8. オブジェクトダウンロード

オブジェクトをバケットからダウンロードします。

NifclaObstGetObject.py(オブジェクト内容取得処理)


    import sys, requests,datetime,NifclaObstCommon

    # 引数格納
    ## バケット名
    bucket_name = sys.argv[1]
    ## ダウンロード元のオブジェクト名
    obj_name = sys.argv[2]
    ## ダウンロード先のオブジェクトパス
    local_obj_name = sys.argv[3]
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate = datetime.datetime.utcnow()
    ## ヘッダ用
    amzdate = utcdate.strftime('%Y%m%dT%H%M%SZ')
    ## CredentialScope用
    datestamp = utcdate.strftime('%Y%m%d')
    
    # シグネチャ作成
    ## リクエストメソッド
    method = 'GET'
    ## ヘッダパラメータ
    signed_headers = 'host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri =  '/' + bucket_name + '/' + obj_name
    ## リクエストクエリパラメータ
    canonical_querystring = ''
    ## リクエストボディ
    request_parameters = ''
    ## ペイロード作成
    payload_hash = NifclaObstCommon.getHashCode(request_parameters)
    ## CanonicalHeaders作成
    canonical_headers = 'host:' + NifclaObstCommon.HOST + '\n' + 'x-amz-content-sha256:' + payload_hash + '\n' + 'x-amz-date:' + amzdate + '\n'
    ## CanonicalRequest作成
    canonical_request = method  + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
    ## CredentialScope作成
    credential_scope = datestamp + '/' + NifclaObstCommon.REGION + '/' + NifclaObstCommon.SERVICE + '/' + 'aws4_request'
    ## 署名文字列作成
    string_to_sign = NifclaObstCommon.ALGORITHM + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  NifclaObstCommon.getHashCode(canonical_request)
    ## 署名キー作成
    signing_key = NifclaObstCommon.getSignatureKey(NifclaObstCommon.SECRET_KEY, datestamp, NifclaObstCommon.REGION, NifclaObstCommon.SERVICE)
    ## シグネチャ生成
    signature = NifclaObstCommon.getSignature(signing_key, string_to_sign)
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header = NifclaObstCommon.ALGORITHM + ' ' + 'Credential=' + NifclaObstCommon.ACCESS_KEY + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
    ## リクエストヘッダ作成
    headers = {'x-amz-content-sha256':payload_hash,
               'x-amz-date':amzdate, 
               'Authorization':authorization_header}
    ## リクエストURL作成
    request_url = NifclaObstCommon.ENDPOINT + canonical_uri + '?' + canonical_querystring
    
    # リクエスト送信
    print('Request URL = ' + request_url)
    print('Send --->')
    req = requests.get(request_url, headers=headers)
    
    # レスポンス受信
    print('Receive <---')
    print('Response code: %d\n' % req.status_code)
    print(req.text)
    
    # レスポンス内容をダウンロードファイルとして保存
    with open(local_obj_name ,mode='wb') as f:
      f.write(req.content)

オブジェクトダウンロード実行
パラメータにバケット名:「new-object-apitest」、ダウンロードファイル名:「upload_pythondata.txt」、ダウンロードファイルパス:「./download/download_pythondata.txt」を設定してオブジェクトダウンロード処理を実行します。オブジェクトダウンロード成功の応答が返却されます。


    # python NifclaObstGetObject.py new-object-apitest upload_pythondata.txt ./download/download_pythondata.txt
    Request URL = https://jp-east-1.storage.api.nifcloud.com/new-object-apitest/upload_pythondata.txt?
    Send --->
    Receive <---
    Response code: 200
    
    Nifcla Object Storage
    Testテスト試験
    Api Test Python

オブジェクトダウンロード後の確認
ダウンロードファイルパス:「./download/download_pythondata.txt」の内容を確認します。
取得した内容がファイルで保存されています。


    # cat ./download/download_pythondata.txt
    Nifcla Object Storage
    Testテスト試験
    Api Test Python

検証実施Bash

1. バケット一覧取得

バケット一覧を取得してバケット作成前の状態を確認します。

nifclaobst_getservice.sh( バケット一覧取得処理)


    #!/bin/bash

    source ./nifclaobst_common.sh
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate=`date -Iseconds -u | sed "s/+/ /g" | awk '{print $1 "Z"}'`
    ## ヘッダ用
    amzdate=`echo -n $utcdate | sed "s/-//g" | sed "s/://g"`
    ## CredentialScope用
    datestamp=`echo -n $utcdate | sed "s/-//g" | sed "s/T/ /g" | awk '{print $1}'`
    
    # シグネチャ作成
    ## リクエストメソッド
    method='GET'
    ## ヘッダパラメータ
    signed_headers='host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri=/
    ## リクエストクエリパラメータ
    canonical_querystring=''
    ## リクエストボディ
    request_parameters=''
    ## ペイロード作成
    payload_hash=`get_hash_code "${request_parameters}"`
    ## CanonicalHeaders作成
    canonical_headers='host:'${HOST}${LF}'x-amz-content-sha256:'${payload_hash}${LF}'x-amz-date:'${amzdate}${LF}
    ## CanonicalRequest作成
    canonical_request=${method}${LF}${canonical_uri}${LF}${canonical_querystring}${LF}${canonical_headers}${LF}${signed_headers}${LF}${payload_hash}
    ## CredentialScope作成
    credential_scope=${datestamp}/${REGION}/${SERVICE}/'aws4_request'
    ## 署名文字列作成
    string_to_sign=${ALGORITHM}${LF}''${amzdate}${LF}${credential_scope}${LF}`get_hash_code "${canonical_request}"`
    ## 署名キー作成
    signing_key=`get_signature_key ${SECRET_KEY} ${datestamp} ${REGION} ${SERVICE}`
    ## シグネチャ生成
    signature=`get_signature ${signing_key} "${string_to_sign}"`
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header=${ALGORITHM}' Credential='${ACCESS_KEY}'/'${credential_scope}', SignedHeaders='${signed_headers}', Signature='${signature}
    
    ## リクエストURL作成
    request_url=${ENDPOINT}${canonical_uri}'?'${canonical_querystring}
    
    # リクエスト送信&レスポンス受信
    curl -X GET  \
      -H "x-amz-content-sha256: ${payload_hash}" \
      -H "x-amz-date: ${amzdate}" \
      -H "Authorization: ${authorization_header}" \
      ${request_url} -i

バケット一覧取得
バケット一覧取得を実行します。バケット一覧の内容が返却されます。


    # ./nifclaobst_getservice.sh
    HTTP/1.1 200 OK
    Date: Mon, 13 Jun 2022 05:38:18 GMT
    Server: Apache
    x-amz-request-id: 1655098698441130
    x-amz-id-2: 12084406
    Content-Length: 479
    x-ntap-sg-trace-id: fb439249f64c1ed8
    Content-Type: application/xml
    Connection: close
    
    <?xml version="1.0" encoding="UTF-8"?>
    <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>XXXXXXXXXXXXXX</ID><DisplayName>XXXXXXXXXXXXXXX/XXXXXXXXXXXXXXX</DisplayName></Owner><Buckets><Bucket><Name>multibk-db-dump</Name><CreationDate>2022-05-10T07:01:28.005Z</CreationDate></Bucket><Bucket><Name>new-object-apitest</Name><CreationDate>2022-06-07T04:10:20.640Z</CreationDate></Bucket></Buckets></ListAllMyBucketsResult>

2. バケット作成

バケットを作成します。

nifclaobst_putbucket.sh( バケット作成処理)


    #!/bin/bash

    source ./nifclaobst_common.sh
    
    # 引数格納
    ## バケット名
    bucket_name=$1
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate=`date -Iseconds -u | sed "s/+/ /g" | awk '{print $1 "Z"}'`
    ## ヘッダ用
    amzdate=`echo -n $utcdate | sed "s/-//g" | sed "s/://g"`
    ## CredentialScope用
    datestamp=`echo -n $utcdate | sed "s/-//g" | sed "s/T/ /g" | awk '{print $1}'`
    
    # シグネチャ作成
    ## リクエストメソッド
    method='PUT'
    ## ヘッダパラメータ
    signed_headers='host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri=/${bucket_name}
    ## リクエストクエリパラメータ
    canonical_querystring=''
    ## リクエストボディ
    request_parameters=''
    ## ペイロード作成
    payload_hash=`get_hash_code "${request_parameters}"`
    ## CanonicalHeaders作成
    canonical_headers='host:'${HOST}${LF}'x-amz-content-sha256:'${payload_hash}${LF}'x-amz-date:'${amzdate}${LF}
    ## CanonicalRequest作成
    canonical_request=${method}${LF}${canonical_uri}${LF}${canonical_querystring}${LF}${canonical_headers}${LF}${signed_headers}${LF}${payload_hash}
    ## CredentialScope作成
    credential_scope=${datestamp}/${REGION}/${SERVICE}/'aws4_request'
    ## 署名文字列作成
    string_to_sign=${ALGORITHM}${LF}''${amzdate}${LF}${credential_scope}${LF}`get_hash_code "${canonical_request}"`
    ## 署名キー作成
    signing_key=`get_signature_key ${SECRET_KEY} ${datestamp} ${REGION} ${SERVICE}`
    ## シグネチャ生成
    signature=`get_signature ${signing_key} "${string_to_sign}"`
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header=${ALGORITHM}' Credential='${ACCESS_KEY}'/'${credential_scope}', SignedHeaders='${signed_headers}', Signature='${signature}
    ## リクエストURL作成
    request_url=${ENDPOINT}${canonical_uri}
    
    # リクエスト送信
    curl -X PUT \
      -H "x-amz-content-sha256: ${payload_hash}" \
      -H "x-amz-date: ${amzdate}" \
      -H "Authorization: ${authorization_header}" \
      ${request_url} -i -d "${request_parameters}"

バケット作成実行
パラメータにバケット名:「new-object-apitest-bash」を設定してバケット作成処理を実行します。作成成功の応答が返却されます。


    # ./nifclaobst_putbucket.sh new-object-apitest-bash
    HTTP/1.1 200 OK
    Date: Mon, 13 Jun 2022 05:40:04 GMT
    Server: Apache
    x-amz-request-id: 1655098804547359
    x-amz-id-2: 12445699
    Content-Length: 0
    x-ntap-sg-trace-id: 48058712e63b8dcd
    Location: /new-object-apitest-bash
    Connection: close

バケット一覧取得
バケットが作成されたことを確認するためバケット一覧取得を実行します。作成後のバケット一覧の内容が返却されます。
バケット名:「new-object-apitest-bash」が作成されています。


    # ./nifclaobst_getservice.sh
    HTTP/1.1 200 OK
    Date: Mon, 13 Jun 2022 05:40:29 GMT
    Server: Apache
    x-amz-request-id: 1655098829421979
    x-amz-id-2: 12445699
    Content-Length: 585
    x-ntap-sg-trace-id: f6a3bdc2d6eb8d64
    Content-Type: application/xml
    Connection: close
    
    <?xml version="1.0" encoding="UTF-8"?>
    <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>XXXXXXXXXXXXXX</ID><DisplayName>XXXXXXXXXXXXXXX/XXXXXXXXXXXXXXX</DisplayName></Owner><Buckets><Bucket><Name>multibk-db-dump</Name><CreationDate>2022-05-10T07:01:28.005Z</CreationDate></Bucket><Bucket><Name>new-object-apitest</Name><CreationDate>2022-06-07T04:10:20.640Z</CreationDate></Bucket><Bucket><Name>new-object-apitest-bash</Name><CreationDate>2022-06-13T05:40:04.588Z</CreationDate></Bucket></Buckets></ListAllMyBucketsResult>

3. バケット権限ポリシー取得

バケット権限ポリシー設定を取得します。

nifclaobst_getpolicy.sh(バケット権限ポリシー取得処理)


    #!/bin/bash

    source ./nifclaobst_common.sh
    
    # 引数格納
    ## バケット名
    bucket_name=$1
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate=`date -Iseconds -u | sed "s/+/ /g" | awk '{print $1 "Z"}'`
    ## ヘッダ用
    amzdate=`echo -n $utcdate | sed "s/-//g" | sed "s/://g"`
    ## CredentialScope用
    datestamp=`echo -n $utcdate | sed "s/-//g" | sed "s/T/ /g" | awk '{print $1}'`
    
    # シグネチャ作成
    ## リクエストメソッド
    method='GET'
    ## ヘッダパラメータ
    signed_headers='host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri=/${bucket_name}
    ## リクエストクエリパラメータ
    canonical_querystring='policy='
    ## リクエストボディ
    request_parameters=''
    ## ペイロード作成
    payload_hash=`get_hash_code "${request_parameters}"`
    ## CanonicalHeaders作成
    canonical_headers='host:'${HOST}${LF}'x-amz-content-sha256:'${payload_hash}${LF}'x-amz-date:'${amzdate}${LF}
    ## CanonicalRequest作成
    canonical_request=${method}${LF}${canonical_uri}${LF}${canonical_querystring}${LF}${canonical_headers}${LF}${signed_headers}${LF}${payload_hash}
    ## CredentialScope作成
    credential_scope=${datestamp}/${REGION}/${SERVICE}/'aws4_request'
    ## 署名文字列作成
    string_to_sign=${ALGORITHM}${LF}''${amzdate}${LF}${credential_scope}${LF}`get_hash_code "${canonical_request}"`
    ## 署名キー作成
    signing_key=`get_signature_key ${SECRET_KEY} ${datestamp} ${REGION} ${SERVICE}`
    ## シグネチャ生成
    signature=`get_signature ${signing_key} "${string_to_sign}"`
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header=${ALGORITHM}' Credential='${ACCESS_KEY}'/'${credential_scope}', SignedHeaders='${signed_headers}', Signature='${signature}
    
    ## リクエストURL作成
    request_url=${ENDPOINT}${canonical_uri}'?'${canonical_querystring}
    
    # リクエスト送信&レスポンス受信
    curl -X GET  \
      -H "x-amz-content-sha256: ${payload_hash}" \
      -H "x-amz-date: ${amzdate}" \
      -H "Authorization: ${authorization_header}" \
      ${request_url} -i

バケット権限ポリシー取得
パラメータにバケット名:「new-object-apitest-bash」を設定してバケット権限ポリシー取得処理を実行します。権限ポリシー設定前の応答が返却されます。
バケット作成直後は権限ポリシーが設定されていないのでエラー応答が返却されます。
※作成直後のバケットは、作成者のみフルアクセス権限が設定されているだけです。


    # ./nifclaobst_getpolicy.sh new-object-apitest-bash
    HTTP/1.1 404 Not Found
    Date: Mon, 13 Jun 2022 05:42:25 GMT
    Server: Apache
    x-amz-request-id: 1655098945454961
    x-amz-id-2: 12084406
    Content-Length: 247
    x-ntap-sg-trace-id: 7a6fc61b098d80dd
    Content-Type: application/xml
    Connection: close
    
    <?xml version="1.0" encoding="UTF-8"?>
    <Error><Code>NoSuchBucketPolicy</Code><Message>The specified bucket does not have a bucket policy.</Message><Resource>/new-object-apitest-bash?policy=</Resource><RequestId>1655098945454961</RequestId></Error>

4. バケット権限ポリシー設定

バケットに権限ポリシーを設定します。 バケットの運用計画(他ユーザに閲覧権限、編集権限を付与する等)に沿った内容を設定します。
※設定内容は上記Python検証と同じです。

nifclaobst_putpolicy.sh( バケット権限付与処理)


    #!/bin/bash

    source ./nifclaobst_common.sh
    
    # 引数格納
    ## バケット名
    bucket_name=$1
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate=`date -Iseconds -u | sed "s/+/ /g" | awk '{print $1 "Z"}'`
    ## ヘッダ用
    amzdate=`echo -n $utcdate | sed "s/-//g" | sed "s/://g"`
    ## CredentialScope用
    datestamp=`echo -n $utcdate | sed "s/-//g" | sed "s/T/ /g" | awk '{print $1}'`
    
    # シグネチャ作成
    ## リクエストメソッド
    method='PUT'
    ## ヘッダパラメータ
    signed_headers='content-md5;host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri=/${bucket_name}
    ## リクエストクエリパラメータ
    canonical_querystring='policy='
    ## リクエストボディ
    request_parameters='{'
    request_parameters+=' "Statement": [ '
    request_parameters+='  { '
    request_parameters+='   "Sid": "NifclaTestPolicy",'
    request_parameters+='   "Effect": "Allow",'
    request_parameters+='   "Principal": {'
    request_parameters+='     "SGWS": '
    request_parameters+='     ['
    request_parameters+='      "urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXX",'
    request_parameters+='      "urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXX"'
    request_parameters+='     ]'
    request_parameters+='    },'
    request_parameters+='  "Action": "s3:*",'
    request_parameters+='  "Resource": "urn:sgws:s3:::'${bucket_name}'/*"'
    request_parameters+='  }'
    request_parameters+=' ]'
    request_parameters+='}'
    ## リクエストcontent_md5
    content_md5=`get_hash_code_md5 "${request_parameters}"`
    ## ペイロード作成
    payload_hash=`get_hash_code "${request_parameters}"`
    ## CanonicalHeaders作成
    canonical_headers='content-md5:'${content_md5}${LF}'host:'${HOST}${LF}'x-amz-content-sha256:'${payload_hash}${LF}'x-amz-date:'${amzdate}${LF}
    ## CanonicalRequest作成
    canonical_request=${method}${LF}${canonical_uri}${LF}${canonical_querystring}${LF}${canonical_headers}${LF}${signed_headers}${LF}${payload_hash}
    ## CredentialScope作成
    credential_scope=${datestamp}/${REGION}/${SERVICE}/'aws4_request'
    ## 署名文字列作成
    string_to_sign=${ALGORITHM}${LF}''${amzdate}${LF}${credential_scope}${LF}`get_hash_code "${canonical_request}"`
    ## 署名キー作成
    signing_key=`get_signature_key ${SECRET_KEY} ${datestamp} ${REGION} ${SERVICE}`
    ## シグネチャー生成
    signature=`get_signature ${signing_key} "${string_to_sign}"`
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header=${ALGORITHM}' Credential='${ACCESS_KEY}'/'${credential_scope}', SignedHeaders='${signed_headers}', Signature='${signature}
    ## リクエストURL作成
    request_url=${ENDPOINT}${canonical_uri}'?'${canonical_querystring}
    
    # リクエスト送信
    curl -X PUT  \
      -H "x-amz-content-sha256: ${payload_hash}" \
      -H "x-amz-date: ${amzdate}" \
      -H "Authorization: ${authorization_header}" \
      -H "Content-MD5: ${content_md5}" \
      ${request_url} -i -d "${request_parameters}"

バケット権限ポリシー設定実行
パラメータにバケット名:「new-object-apitest-bash」を設定してバケット権限ポリシー設定処理を実行します。作成成功の応答が返却されます。


    # ./nifclaobst_putpolicy.sh new-object-apitest-bash
    HTTP/1.1 204 No Content
    Date: Mon, 13 Jun 2022 05:48:49 GMT
    Server: Apache
    x-amz-request-id: 1655099329571591
    x-amz-id-2: 12445699
    x-ntap-sg-trace-id: 6279a8bb0869b1ed
    Connection: close

バケット権限ポリシー設定後確認
バケット権限ポリシーが作成されたことを確認するためバケット権限ポリシー取得を実行します。設定後の権限ポリシーの内容が返却されます。
権限ポリシー名:「NifclaTestPolicyBash」が作成されています。


    # ./nifclaobst_getpolicy.sh new-object-apitest-bash
    HTTP/1.1 200 OK
    Date: Mon, 13 Jun 2022 05:49:13 GMT
    Server: Apache
    x-amz-request-id: 1655099353720124
    x-amz-id-2: 12616874
    Content-Length: 266
    x-ntap-sg-trace-id: 30935e3e5ce0b1d
    Content-Type: application/json
    Connection: close
    
    {"Statement":[{"Sid":"NifclaTestPolicyBash","Effect":"Allow","Principal":{"SGWS":["urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX","urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX"]},"Action":"s3:*","Resource":"urn:sgws:s3:::new-object-apitest-bash/*"}]}

5. バケット権限ポリシー設定yaml形式

上記4. バケット権限ポリシー設定をyamlファイルに外部化した場合の設定方法です。

※ディレクトリ:./policy配下にファイル名:policy_bash.yamlを配置します。


    # cat ./policy/policy_bash.yaml
    Statement:
      -
        Sid: NifclaTestPolicyBash
        Effect: Allow
        Principal:
          SGWS:
               - 'urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX'
               - 'urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX'
        Action: 's3:*'
        Resource: 'urn:sgws:s3:::new-object-apitest-bash/*'

nifclaobst_putpolicyyaml.sh(バケット権限ポリシー設定処理※yamlファイル形式)


    #!/bin/bash

    source ./nifclaobst_common.sh
    
    # 引数格納
    ## バケット名
    bucket_name=$1
    ## policy設定ファイルパス
    policy_filepath=$2
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate=`date -Iseconds -u | sed "s/+/ /g" | awk '{print $1 "Z"}'`
    ## ヘッダ用
    amzdate=`echo -n $utcdate | sed "s/-//g" | sed "s/://g"`
    ## CredentialScope用
    datestamp=`echo -n $utcdate | sed "s/-//g" | sed "s/T/ /g" | awk '{print $1}'`
    
    # シグネチャ作成
    ## リクエストメソッド
    method='PUT'
    ## ヘッダパラメータ
    signed_headers='content-md5;host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri=/${bucket_name}
    ## リクエストクエリパラメータ
    canonical_querystring='policy='
    ## リクエストボディ
    request_parameters=`load_yaml_to_string "${policy_filepath}"`
    ## リクエストcontent_md5
    content_md5=`get_hash_code_md5 "${request_parameters}"`
    ## ペイロード作成
    payload_hash=`get_hash_code "${request_parameters}"`
    ## CanonicalHeaders作成
    canonical_headers='content-md5:'${content_md5}${LF}'host:'${HOST}${LF}'x-amz-content-sha256:'${payload_hash}${LF}'x-amz-date:'${amzdate}${LF}
    ## CanonicalRequest作成
    canonical_request=${method}${LF}${canonical_uri}${LF}${canonical_querystring}${LF}${canonical_headers}${LF}${signed_headers}${LF}${payload_hash}
    ## CredentialScope作成
    credential_scope=${datestamp}/${REGION}/${SERVICE}/'aws4_request'
    ## 署名文字列作成
    string_to_sign=${ALGORITHM}${LF}''${amzdate}${LF}${credential_scope}${LF}`get_hash_code "${canonical_request}"`
    ## 署名キー作成
    signing_key=`get_signature_key ${SECRET_KEY} ${datestamp} ${REGION} ${SERVICE}`
    ## シグネチャ生成
    signature=`get_signature ${signing_key} "${string_to_sign}"`
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header=${ALGORITHM}' Credential='${ACCESS_KEY}'/'${credential_scope}', SignedHeaders='${signed_headers}', Signature='${signature}
    ## リクエストURL作成
    request_url=${ENDPOINT}${canonical_uri}'?'${canonical_querystring}
    
    # リクエスト送信
    curl -X PUT  \
      -H "x-amz-content-sha256: ${payload_hash}" \
      -H "x-amz-date: ${amzdate}" \
      -H "Authorization: ${authorization_header}" \
      -H "Content-MD5: ${content_md5}" \
      ${request_url} -i -d "${request_parameters}"

バケット権限ポリシー設定実行
パラメータにバケット名:「new-object-apitest-bash」、yamlファイルパス:「./policy/policy_bash.yaml」を設定してバケット権限ポリシー設定処理を実行します。作成成功の応答が返却されます。


    # ./nifclaobst_putpolicyyaml.sh new-object-apitest-bash ./policy/policy_bash.yaml
    HTTP/1.1 204 No Content
    Date: Mon, 13 Jun 2022 05:51:17 GMT
    Server: Apache
    x-amz-request-id: 1655099477153231
    x-amz-id-2: 12445699
    x-ntap-sg-trace-id: 209eac2c9ad8bfd2
    Connection: close

バケット権限ポリシー設定後確認
バケット権限ポリシー取得処理を実行します。ポリシー設定後の応答が返却されます。
権限ポリシー名:「NifclaTestPolicyBash」が作成されています。


    # ./nifclaobst_getpolicy.sh new-object-apitest-bash
    HTTP/1.1 200 OK
    Date: Mon, 13 Jun 2022 05:51:45 GMT
    Server: Apache
    x-amz-request-id: 1655099505936499
    x-amz-id-2: 12616874
    Content-Length: 266
    x-ntap-sg-trace-id: a5404eb418d65d78
    Content-Type: application/json
    Connection: close
    
    {"Statement":[{"Sid":"NifclaTestPolicyBash","Effect":"Allow","Principal":{"SGWS":["urn:sgws:identity::urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX","urn:sgws:identity::urn:sgws:identity::XXXXXXXXXXXXXXXXXX:user/XXXXXXXX"]},"Action":"s3:*","Resource":"urn:sgws:s3:::new-object-apitest-bash/*"}]}

6. バケット内オブジェクト一覧取得

バケット内オブジェクト一覧を取得してオブジェクトアップロード前の状態を確認します。

nifclaobst_getbucket.sh( オブジェクト一覧処理)


    #!/bin/bash

    source ./nifclaobst_common.sh
    
    # 引数格納
    ## バケット名
    bucket_name=$1
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate=`date -Iseconds -u | sed "s/+/ /g" | awk '{print $1 "Z"}'`
    ## ヘッダ用
    amzdate=`echo -n $utcdate | sed "s/-//g" | sed "s/://g"`
    ## CredentialScope用
    datestamp=`echo -n $utcdate | sed "s/-//g" | sed "s/T/ /g" | awk '{print $1}'`
    
    # シグネチャ作成
    ## リクエストメソッド
    method='GET'
    ## ヘッダパラメータ
    signed_headers='host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri=/${bucket_name}
    ## リクエストクエリパラメータ
    canonical_querystring=''
    ## リクエストボディ
    request_parameters=''
    ## ペイロード作成
    payload_hash=`get_hash_code "${request_parameters}"`
    ## CanonicalHeaders作成
    canonical_headers='host:'${HOST}${LF}'x-amz-content-sha256:'${payload_hash}${LF}'x-amz-date:'${amzdate}${LF}
    ## CanonicalRequest作成
    canonical_request=${method}${LF}${canonical_uri}${LF}${canonical_querystring}${LF}${canonical_headers}${LF}${signed_headers}${LF}${payload_hash}
    ## CredentialScope作成
    credential_scope=${datestamp}/${REGION}/${SERVICE}/'aws4_request'
    ## 署名文字列作成
    string_to_sign=${ALGORITHM}${LF}''${amzdate}${LF}${credential_scope}${LF}`get_hash_code "${canonical_request}"`
    ## 署名キー作成
    signing_key=`get_signature_key ${SECRET_KEY} ${datestamp} ${REGION} ${SERVICE}`
    ## シグネチャ生成
    signature=`get_signature ${signing_key} "${string_to_sign}"`
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header=${ALGORITHM}' Credential='${ACCESS_KEY}'/'${credential_scope}', SignedHeaders='${signed_headers}', Signature='${signature}
    
    ## リクエストURL作成
    request_url=${ENDPOINT}${canonical_uri}'?'${canonical_querystring}
    
    # リクエスト送信&レスポンス受信
    curl -X GET  \
      -H "x-amz-content-sha256: ${payload_hash}" \
      -H "x-amz-date: ${amzdate}" \
      -H "Authorization: ${authorization_header}" \
      ${request_url} -i

バケット内オブジェクト一覧取得
パラメータにバケット名:「new-object-apitest-bash」を設定してバケット内オブジェクト一覧取得処理を実行します。オブジェクトアップロード前のバケット内オブジェクト一覧の内容が返却されます。


    # ./nifclaobst_getbucket.sh new-object-apitest-bash
    HTTP/1.1 200 OK
    Date: Mon, 13 Jun 2022 06:00:45 GMT
    Server: Apache
    x-amz-request-id: 1655100045331466
    x-amz-id-2: 12445699
    Content-Length: 249
    x-ntap-sg-trace-id: 3ee508da2d5af6dc
    Content-Type: application/xml
    Connection: close
    
    <?xml version="1.0" encoding="UTF-8"?>
    <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>new-object-apitest-bash</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated></ListBucketResult>

7. オブジェクトアップロード

オブジェクトをバケットにアップロードします。

nifclaobst_putobject.sh(オブジェクトアップロード処理)


    #!/bin/bash

    source ./nifclaobst_common.sh
    
    # 引数格納
    ## バケット名
    bucket_name=$1
    ## アップロード先のオブジェクト名
    obj_name=$2
    ## アップロード元のオブジェクトパス
    local_obj_name=$3
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate=`date -Iseconds -u | sed "s/+/ /g" | awk '{print $1 "Z"}'`
    ## ヘッダ用
    amzdate=`echo -n $utcdate | sed "s/-//g" | sed "s/://g"`
    ## CredentialScope用
    datestamp=`echo -n $utcdate | sed "s/-//g" | sed "s/T/ /g" | awk '{print $1}'`
    
    # シグネチャ作成
    ## リクエストメソッド
    method='PUT'
    ## リクエストcontent_length
    content_length=`wc -c < ${local_obj_name}`
    ## リクエストcontent_type
    content_type='text/plain'
    ## ヘッダパラメータ
    signed_headers='content-length;content-type;host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri=/${bucket_name}/${obj_name}
    ## リクエストクエリパラメータ
    canonical_querystring=''
    ## リクエストボディ
    request_parameters=''
    ## ペイロード作成
    payload_hash=`get_hash_code "${request_parameters}"`
    ## CanonicalHeaders作成
    canonical_headers='content-length:'${content_length}${LF}'content-type:'${content_type}${LF}'host:'${HOST}${LF}'x-amz-content-sha256:'${payload_hash}${LF}'x-amz-date:'${amzdate}${LF}
    ## CanonicalRequest作成
    canonical_request=${method}${LF}${canonical_uri}${LF}${canonical_querystring}${LF}${canonical_headers}${LF}${signed_headers}${LF}${payload_hash}
    ## CredentialScope作成
    credential_scope=${datestamp}/${REGION}/${SERVICE}/'aws4_request'
    ## 署名文字列作成
    string_to_sign=${ALGORITHM}${LF}''${amzdate}${LF}${credential_scope}${LF}`get_hash_code "${canonical_request}"`
    ## 署名キー作成
    signing_key=`get_signature_key ${SECRET_KEY} ${datestamp} ${REGION} ${SERVICE}`
    ## シグネチャ生成
    signature=`get_signature ${signing_key} "${string_to_sign}"`
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header=${ALGORITHM}' Credential='${ACCESS_KEY}'/'${credential_scope}', SignedHeaders='${signed_headers}', Signature='${signature}
    ## リクエストURL作成
    request_url=${ENDPOINT}${canonical_uri}'?'${canonical_querystring}
    
    # リクエスト送信&レスポンス受信
    curl -X PUT -T ${local_obj_name} \
      -H "x-amz-content-sha256: ${payload_hash}" \
      -H "x-amz-date: ${amzdate}" \
      -H "Authorization: ${authorization_header}" \
      -H "Content-Length: ${content_length}" \
      -H "Content-Type: ${content_type}" \
      ${request_url} -i

ブジェクトアップロード実行
以下の内容のファイルを指定したバケットにアップロードします。 ※ディレクトリ:./upload配下にファイル名:upload_data.txtを配置した場合


    # cat ./upload/upload_data.txt
    Nifcla Object Storage
    Testテスト試験
    Api Test Bash

パラメータにバケット名:「new-object-apitest-bash」、アップロードファイル名:「upload_bashdata.txt」、アップロード元ファイルパス:「./upload/upload_data.txt」を設定してオブジェクトアップロード処理を実行します。オブジェクトアップロード成功の応答が返却されます。


    # ./nifclaobst_putobject.sh new-object-apitest-bash upload_bashdata.txt ./upload/upload_data.txt
    HTTP/1.1 100 Continue
    
    HTTP/1.1 200 OK
    Date: Mon, 13 Jun 2022 06:04:35 GMT
    Server: Apache
    x-amz-request-id: 1655100275498221
    x-amz-id-2: 12616874
    Content-Length: 0
    x-ntap-sg-trace-id: ee2a765c50455f49
    ETag: "8b8610027d710b46153a05a8c93835f3"
    Connection: close

バケット内オブジェクト一覧取得 オブジェクトがアップロードされたことを確認するためにバケット内オブジェクト一覧取得を実行します。 パラメータにバケット名:「new-object-apitest-bash」を設定してバケット内オブジェクト一覧取得処理を実行します。オブジェクトアップロード後のオブジェクト一覧の内容が返却されます。
アップロードファイル名:「upload_bashdata.txt」がアップロードされています。


    # ./nifclaobst_getbucket.sh new-object-apitest-bash
    HTTP/1.1 200 OK
    Date: Mon, 13 Jun 2022 06:05:12 GMT
    Server: Apache
    x-amz-request-id: 1655100312687180
    x-amz-id-2: 12445699
    Content-Length: 587
    x-ntap-sg-trace-id: ca0cb36ad1fb3d75
    Content-Type: application/xml
    Connection: close
    
    <?xml version="1.0" encoding="UTF-8"?>
    <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>new-object-apitest-bash</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>upload_bashdata.txt</Key><LastModified>2022-06-13T06:04:35.507Z</LastModified><ETag>"8b8610027d710b46153a05a8c93835f3"</ETag><Size>56</Size><Owner><ID>xxxxxxxxxxxxxxxxxxxxxx</ID><DisplayName>sFcwSYdQ/6d454ab4873f49b0a43a168ad65c0ded/nct-bct46334</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>

8. オブジェクトダウンロード

オブジェクトをバケットからダウンロードします。

※サンプルプログラムのcurlコマンドオプションについて。
"-i"を使用するとダウンロードファイルにヘッダ情報が出力されてしまうので
情報量が増えてしまいますが詳細情報出力する"-v"を使用しています。

nifclaobst_getobject.sh( オブジェクト内容取得処理)


    #!/bin/bash

    source ./nifclaobst_common.sh
    
    # 引数格納
    ## バケット名
    bucket_name=$1
    ## ダウンロード元のオブジェクト名
    obj_name=$2
    ## ダウンロード先のオブジェクトパス
    local_obj_name=$3
    
    # タイムスタンプ取得&編集
    ## タイムスタンプ取得
    utcdate=`date -Iseconds -u | sed "s/+/ /g" | awk '{print $1 "Z"}'`
    ## ヘッダ用
    amzdate=`echo -n $utcdate | sed "s/-//g" | sed "s/://g"`
    ## CredentialScope用
    datestamp=`echo -n $utcdate | sed "s/-//g" | sed "s/T/ /g" | awk '{print $1}'`
    
    # シグネチャ作成
    ## リクエストメソッド
    method='GET'
    ## ヘッダパラメータ
    signed_headers='host;x-amz-content-sha256;x-amz-date'
    ## パスパラメータ
    canonical_uri=/${bucket_name}/${obj_name}
    ## リクエストクエリパラメータ
    canonical_querystring=''
    ## リクエストボディ
    request_parameters=''
    ## ペイロード作成
    payload_hash=`get_hash_code "${request_parameters}"`
    ## CanonicalHeaders作成
    canonical_headers='host:'${HOST}${LF}'x-amz-content-sha256:'${payload_hash}${LF}'x-amz-date:'${amzdate}${LF}
    ## CanonicalRequest作成
    canonical_request=${method}${LF}${canonical_uri}${LF}${canonical_querystring}${LF}${canonical_headers}${LF}${signed_headers}${LF}${payload_hash}
    ## CredentialScope作成
    credential_scope=${datestamp}/${REGION}/${SERVICE}/'aws4_request'
    ## 署名文字列作成
    string_to_sign=${ALGORITHM}${LF}''${amzdate}${LF}${credential_scope}${LF}`get_hash_code "${canonical_request}"`
    ## 署名キー作成
    signing_key=`get_signature_key ${SECRET_KEY} ${datestamp} ${REGION} ${SERVICE}`
    ## シグネチャー生成
    signature=`get_signature ${signing_key} "${string_to_sign}"`
    
    # リクエスト作成
    ## Authorizationヘッダ作成
    authorization_header=${ALGORITHM}' Credential='${ACCESS_KEY}'/'${credential_scope}', SignedHeaders='${signed_headers}', Signature='${signature}
    
    ## リクエストURL作成
    request_url=${ENDPOINT}${canonical_uri}'?'${canonical_querystring}
    
    # リクエスト送信&レスポンス受信
    curl -X GET  \
      -H "x-amz-content-sha256: ${payload_hash}" \
      -H "x-amz-date: ${amzdate}" \
      -H "Authorization: ${authorization_header}" \
      ${request_url} -v -o ${local_obj_name}

オブジェクトダウンロード実行
パラメータにバケット名:「new-object-apitest-bash」、ダウンロードファイル名:「upload_bashdata.txt」、ダウンロードファイルパス:「./download/download_bashdata.txt」を設定してオブジェクトダウンロード処理を実行します。オブジェクトダウンロード成功の応答が返却されます。


    # ./nifclaobst_getobject.sh new-object-apitest-bash upload_bashdata.txt ./download/download_bashdata.txt
    -----省略-----
    { [5 bytes data]
    < HTTP/1.1 200 OK
    < Date: Tue, 14 Jun 2022 02:25:59 GMT
    < Server: Apache
    < x-amz-request-id: 1655173559408081
    < x-amz-id-2: 12616874
    < Content-Length: 56
    < x-ntap-sg-trace-id: 7598db072612ed31
    < ETag: "8b8610027d710b46153a05a8c93835f3"
    < x-amz-server-side-encryption: AES256
    < Content-Type: text/plain; charset=UTF-8
    < Last-Modified: Mon, 13 Jun 2022 06:04:35 GMT
    < Accept-Ranges: bytes
    < Connection: close
    <
    { [56 bytes data]
    100    56  100    56    0     0    504      0 --:--:-- --:--:-- --:--:--   504
    -----省略-----

オブジェクトダウンロード後の確認
ダウンロードファイルパス:「./download/download_bashdata.txt」の内容を確認します。
取得した内容がファイルで保存されています。


    # cat ./download/download_bashdata.txt
    Nifcla Object Storage
    Testテスト試験
    Api Test Bash

まとめ

今回は、APIを利用したニフクラオブジェクトストレージサービスの操作を紹介しました。

この他にも様々な場面で利用できるAPIを提供しています。
PHP、Ruby、node.js等の他言語でも上記プログラムに準ずる内容を構築すればAPIを利用できます。
また、クライアントツールが同梱されたニフクラ オブジェクトストレージサービス SDK for Javaも提供しています。

バケット(ストレージ領域)の作成やオブジェクト(フォルダーやファイル)の作成・一覧の取得・削除などが容易に可能です。ぜひ利用してみてください。
ここまで読んでいただきありがとうございました!

注意事項

本記事で記載した各サービス/ニフクラの機能等は、2022年6月時点の情報です。ご利用の際は、各サービス/ニフクラの機能の最新情報をご確認ください。

PageTop