ablog

不器用で落着きのない技術者のメモ

QueryEditor v2 で Redshift にアクセスするための最小権限

QueryEditor v2 を利用する IAM ロール / IAM ユーザーにアタッチする。

  • IAM ポリシー
    • AmazonRedshiftReadOnlyAccess
    • AmazonRedshiftQueryEditorV2NoSharing
  • IAM 権限
    • redshift:GetClusterCredential
    • redshift:CreateClusterUser
    • redshift:JoinGroup
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
             "redshift:GetClusterCredentials",
             "redshift:CreateClusterUser",
             "redshift:JoinGroup"
            ],
    "Resource": "*"
  }
}

YCSB から DynamoDB に結果整合性と強い整合性で負荷をかけてみて、レイテンシを計測してみた

YCSB から DynamoDB に結果整合性と強い整合性で負荷をかけてみて、レイテンシを計測してみた。

  • DynamoDB のテーブルを作成する
    • テーブル名: usertable
    • パーティションキー: firstname (String)
    • キャパシティモード: Provisioned (RCU: 10,000、WCU: 10,000、AutoScaling なし)

  • ~/YCSB/dynamodb/conf/dynamodb.properties
    • 結果整合性では dynamodb.consistentReads を false、強力な整合性では dynamodb.consistentReads を true にして実行。
dynamodb.awsCredentialsFile = dynamodb/conf/AWSCredentials.properties
dynamodb.primaryKey = firstname
dynamodb.endpoint = http://dynamodb.ap-northeast-1.amazonaws.com
#dynamodb.consistentReads = false
dynamodb.consistentReads = true
  • ~/YCSB/dynamodb/conf/AWSCredentials.properties
    • IAM ユーザーとクレデンシャルを作成して、指定する。
accessKey = …
secretKey = …
  • ~/YCSB/workloads/workloada_ddb
recordcount=100000
operationcount=100000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=true

readproportion=0.5
updateproportion=0.5
scanproportion=0
insertproportion=0

requestdistribution=zipfian
  • データをロードする
$  ./bin/ycsb load dynamodb -P workloads/workloada_ddb_ec -P dynamodb/conf/dynamodb.properties
DBWrapper: report latency for each error is false and specific error codes to track for latency are: []
[OVERALL], RunTime(ms), 601226
[OVERALL], Throughput(ops/sec), 166.32680556063775
[TOTAL_GCS_PS_Scavenge], Count, 389
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 537
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.08931749458606247
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 389
[TOTAL_GC_TIME], Time(ms), 537
[TOTAL_GC_TIME_%], Time(%), 0.08931749458606247
[CLEANUP], Operations, 1
[CLEANUP], AverageLatency(us), 10.0
[CLEANUP], MinLatency(us), 10
[CLEANUP], MaxLatency(us), 10
[CLEANUP], 95thPercentileLatency(us), 10
[CLEANUP], 99thPercentileLatency(us), 10
[INSERT], Operations, 100000
[INSERT], AverageLatency(us), 5998.10206
[INSERT], MinLatency(us), 3844
[INSERT], MaxLatency(us), 206591
[INSERT], 95thPercentileLatency(us), 7131
[INSERT], 99thPercentileLatency(us), 9559
[INSERT], Return=OK, 100000
  • 10万件登録されたことを確認する


計測

  • 結果整合性
    • YCSB/dynamodb/conf/dynamodb.properties の dynamodb.consistentReads = false
$ ./bin/ycsb run dynamodb -P workloads/workloada_ddb -P dynamodb/conf/dynamodb.properties -threads 8

# 1回目
[OVERALL], RunTime(ms), 62444
[OVERALL], Throughput(ops/sec), 1601.434885657549
[TOTAL_GCS_PS_Scavenge], Count, 52
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 173
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.27704823521875604
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 52
[TOTAL_GC_TIME], Time(ms), 173
[TOTAL_GC_TIME_%], Time(%), 0.27704823521875604
[READ], Operations, 49944
[READ], AverageLatency(us), 3399.92071119654[READ], MinLatency(us), 2700[READ], MaxLatency(us), 287487[READ], 95thPercentileLatency(us), 4171[READ], 99thPercentileLatency(us), 7291[READ], Return=OK, 49944
[CLEANUP], Operations, 8
[CLEANUP], AverageLatency(us), 3.0
[CLEANUP], MinLatency(us), 1
[CLEANUP], MaxLatency(us), 14
[CLEANUP], 95thPercentileLatency(us), 14
[CLEANUP], 99thPercentileLatency(us), 14
[UPDATE], Operations, 50056
[UPDATE], AverageLatency(us), 6335.767939907304
[UPDATE], MinLatency(us), 3958
[UPDATE], MaxLatency(us), 287487
[UPDATE], 95thPercentileLatency(us), 7615
[UPDATE], 99thPercentileLatenc

#2回目
[OVERALL], RunTime(ms), 63733
[OVERALL], Throughput(ops/sec), 1569.0458632105817
[TOTAL_GCS_PS_Scavenge], Count, 48
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 172
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.26987588847222005
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 48
[TOTAL_GC_TIME], Time(ms), 172
[TOTAL_GC_TIME_%], Time(%), 0.26987588847222005
[READ], Operations, 49997
[READ], AverageLatency(us), 3515.5819749184952[READ], MinLatency(us), 2744[READ], MaxLatency(us), 286975[READ], 95thPercentileLatency(us), 4319[READ], 99thPercentileLatency(us), 7011[READ], Return=OK, 49997
[CLEANUP], Operations, 8
[CLEANUP], AverageLatency(us), 2.25
[CLEANUP], MinLatency(us), 1
[CLEANUP], MaxLatency(us), 8
[CLEANUP], 95thPercentileLatency(us), 8
[CLEANUP], 99thPercentileLatency(us), 8
[UPDATE], Operations, 50003
[UPDATE], AverageLatency(us), 6475.620122792632
[UPDATE], MinLatency(us), 3934
[UPDATE], MaxLatency(us), 283391
[UPDATE], 95thPercentileLatency(us), 7843
[UPDATE], 99thPercentileLatency(us), 11695
[UPDATE], Return=OK, 50003

#3回目
[OVERALL], RunTime(ms), 78917
[OVERALL], Throughput(ops/sec), 1267.154098609932
[TOTAL_GCS_PS_Scavenge], Count, 50
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 182
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.2306220459470076
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 50
[TOTAL_GC_TIME], Time(ms), 182
[TOTAL_GC_TIME_%], Time(%), 0.2306220459470076
[READ], Operations, 50050
[READ], AverageLatency(us), 3898.9315484515487[READ], MinLatency(us), 2494[READ], MaxLatency(us), 304127[READ], 95thPercentileLatency(us), 6143[READ], 99thPercentileLatency(us), 10727[READ], Return=OK, 50050
[CLEANUP], Operations, 8
[CLEANUP], AverageLatency(us), 4.25
[CLEANUP], MinLatency(us), 1
[CLEANUP], MaxLatency(us), 14
[CLEANUP], 95thPercentileLatency(us), 14
[CLEANUP], 99thPercentileLatency(us), 14
[UPDATE], Operations, 49950
[UPDATE], AverageLatency(us), 7250.0672072072075
[UPDATE], MinLatency(us), 3994
[UPDATE], MaxLatency(us), 298239
[UPDATE], 95thPercentileLatency(us), 10183
[UPDATE], 99thPercentileLatency(us), 16495
[UPDATE], Return=OK, 49950
  • 強力な整合性
    • YCSB/dynamodb/conf/dynamodb.properties の dynamodb.consistentReads = true
$ ./bin/ycsb run dynamodb -P workloads/workloada_ddb -P dynamodb/conf/dynamodb.properties -threads 8

#1回目
[OVERALL], RunTime(ms), 65499
[OVERALL], Throughput(ops/sec), 1526.7408662727676
[TOTAL_GCS_PS_Scavenge], Count, 52
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 181
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.27634009679537097
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 52
[TOTAL_GC_TIME], Time(ms), 181
[TOTAL_GC_TIME_%], Time(%), 0.27634009679537097
[READ], Operations, 49943
[READ], AverageLatency(us), 4211.415593776906[READ], MinLatency(us), 2554[READ], MaxLatency(us), 293887[READ], 95thPercentileLatency(us), 5071[READ], 99thPercentileLatency(us), 9127[READ], Return=OK, 49943
[CLEANUP], Operations, 8
[CLEANUP], AverageLatency(us), 3.125
[CLEANUP], MinLatency(us), 1
[CLEANUP], MaxLatency(us), 10
[CLEANUP], 95thPercentileLatency(us), 10
[CLEANUP], 99thPercentileLatency(us), 10
[UPDATE], Operations, 50057
[UPDATE], AverageLatency(us), 6038.907565375472
[UPDATE], MinLatency(us), 3826
[UPDATE], MaxLatency(us), 275199
[UPDATE], 95thPercentileLatency(us), 7211
[UPDATE], 99thPercentileLaten

#2回目
[OVERALL], RunTime(ms), 68986
[OVERALL], Throughput(ops/sec), 1449.569477865074
[TOTAL_GCS_PS_Scavenge], Count, 48
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 180
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.2609225060157133
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 48
[TOTAL_GC_TIME], Time(ms), 180
[TOTAL_GC_TIME_%], Time(%), 0.2609225060157133
[READ], Operations, 49994[READ], AverageLatency(us), 4463.141556986839[READ], MinLatency(us), 2766[READ], MaxLatency(us), 282367[READ], 95thPercentileLatency(us), 5411[READ], 99thPercentileLatency(us), 9007[READ], Return=OK, 49994
[CLEANUP], Operations, 8
[CLEANUP], AverageLatency(us), 2.5
[CLEANUP], MinLatency(us), 1
[CLEANUP], MaxLatency(us), 9
[CLEANUP], 95thPercentileLatency(us), 9
[CLEANUP], 99thPercentileLatency(us), 9
[UPDATE], Operations, 50006
[UPDATE], AverageLatency(us), 6366.18607767068
[UPDATE], MinLatency(us), 4030
[UPDATE], MaxLatency(us), 282367
[UPDATE], 95thPercentileLatency(us), 7647
[UPDATE], 99thPercentileLatency(us), 11431
[UPDATE], Return=OK, 50006

#3回目
[OVERALL], RunTime(ms), 82930
[OVERALL], Throughput(ops/sec), 1205.8362474375979
[TOTAL_GCS_PS_Scavenge], Count, 49
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 187
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.22549137827083082
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 49
[TOTAL_GC_TIME], Time(ms), 187
[TOTAL_GC_TIME_%], Time(%), 0.22549137827083082
[READ], Operations, 50091[READ], AverageLatency(us), 5216.173084985327[READ], MinLatency(us), 2618[READ], MaxLatency(us), 286719[READ], 95thPercentileLatency(us), 7939[READ], 99thPercentileLatency(us), 13847[READ], Return=OK, 50091
[CLEANUP], Operations, 8
[CLEANUP], AverageLatency(us), 3.75
[CLEANUP], MinLatency(us), 2
[CLEANUP], MaxLatency(us), 9
[CLEANUP], 95thPercentileLatency(us), 9
[CLEANUP], 99thPercentileLatency(us), 9
[UPDATE], Operations, 49909
[UPDATE], AverageLatency(us), 7529.237011360677
[UPDATE], MinLatency(us), 4128
[UPDATE], MaxLatency(us), 284415
[UPDATE], 95thPercentileLatency(us), 10767
[UPDATE], 99thPercentileLatency(us), 17407
[UPDATE], Return=OK, 49909
CloudWatch メトリクス
  • DynamoDB




  • EC2

Redshift Serverless で任意の管理者パスワードを設定する

マネジメントコンソールで Redshift Serverless のワークグループ作成時に [データベース名とパスワード] で [管理者ユーザー認証情報をカスタマイズ] をチェックし、[Manually add the admin password] を選択してパスワードを入力する。

AWS SDK はファイルを S3 にアップロードする際にチェックサムで整合性をチェックしてくれる

AWS SDKMD5 以外を使うと自動でチェックサムをチェックしてくれると聞いて試してみた。

新しいチェックサムのサポート
2022 年 2 月 25 日(米国時間)は、S3 の 4 つのチェックサムアルゴリズムの新しいサポートについてお話しします。Amazon S3 に保存されているデータのチェックサムを計算して保存し、そのチェックサムを使用してアップロードおよびダウンロードリクエストの整合性を確認することが非常に簡単になりました。
(中略)
オブジェクトアップロードAWS SDK の最新バージョンでは、指定されたチェックサムがアップロードの一部として計算され、アップロードの終了時に HTTP トレーラーに含められます。また、事前計算済みチェックサムを指定するオプションもあります。いずれの場合も、S3 はチェックサムを検証し、リクエストの値が S3 によって計算された値と一致する場合はオペレーションを受け入れます。

新機能 – Amazon S3 向け、追加のチェックサムアルゴリズム | Amazon Web Services ブログ

手順

  • アップロードするファイル
$ cat test.txt 
test
$ python s3api put-object --bucket test-bucket-az --key test.txt --body /home/ec2-user/test.txt --checksum-algorithm SHA256
{
    "ETag": "\"d8e8fca2dc0f896fd7cb4cb0031ba249\"",
    "ChecksumSHA256": "8sobtsfpB9Btr+Roflefznazfk6Tt2BQItpS5szCb9I=",
    "ServerSideEncryption": "AES256"
}
$ aws s3api get-object-attributes --bucket test-bucket-az --key test.txt --object-attributes Checksum
{
    "LastModified": "2023-11-28T11:17:33+00:00",
    "Checksum": {
        "ChecksumSHA256": "8sobtsfpB9Btr+Roflefznazfk6Tt2BQItpS5szCb9I="
    }
}

デバッグログ

  • 実行する
$ aws s3api put-object --debug --bucket test-bucket-az --key test.txt --body /home/ec2-user/test.txt --checksum-algorithm SHA256 > debug.log 2>&1
  • debug.log
2023-11-29 00:59:11,123 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/2.9.19 Python/3.9.16 Linux/6.1.61-85.141.amzn2023.x86_64 source/x86_64.amzn.2023
2023-11-29 00:59:11,124 - MainThread - awscli.clidriver - DEBUG - Arguments entered to CLI: ['s3api', 'put-object', '--debug', '--bucket', 'appflow-sfdc-test', '--key', 'test.txt', '--body', '/home/ec2-user/test.txt', '--checksum-algorithm', 'SHA256']

...

2023-11-29 00:59:11,217 - MainThread - botocore.hooks - DEBUG - Event before-call.s3.PutObject: calling handler <function inject_api_version_header_if_needed at 0x7f483bc041f0>
2023-11-29 00:59:11,217 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=PutObject) with params: {'url_path': '/test.txt', 'query_string': {}, 'method': 'PUT', 'headers': {'x-amz-sdk-checksum-algorithm': 'SHA256', 'User-Agent': 'aws-cli/2.9.19 Python/3.9.16 Linux/6.1.61-85.141.amzn2023.x86_64 source/x86_64.amzn.2023 prompt/off command/s3api.put-object', 'Expect': '100-continue', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'aws-chunked', 'X-Amz-Trailer': 'x-amz-checksum-sha256', 'X-Amz-Decoded-Content-Length': '5'}, 'body': <botocore.httpchecksum.AwsChunkedWrapper object at 0x7f4839070fd0>, 'auth_path': '/test-bucket-az/test.txt', 'url': 'https://test-bucket-az.s3.ap-northeast-1.amazonaws.com/test.txt', 'context': {'client_region': 'ap-northeast-1', 'client_config': <botocore.config.Config object at 0x7f4839100e50>, 'has_streaming_input': True, 'auth_type': 'v4', 'signing': {'region': 'ap-northeast-1', 'signing_name': 's3', 'disableDoubleEncoding': True}, 's3_redirect': {'redirected': False, 'bucket': 'test-bucket-az', 'params': {'Body': <_io.BufferedReader name='/home/ec2-user/test.txt'>, 'Bucket': 'test-bucket-az', 'ChecksumAlgorithm': 'SHA256', 'Key': 'test.txt'}}, 'checksum': {'request_algorithm': {'algorithm': 'sha256', 'in': 'trailer', 'name': 'x-amz-checksum-sha256'}}}}
2023-11-29 00:59:11,217 - MainThread - botocore.hooks - DEBUG - Event request-created.s3.PutObject: calling handler <bound method RequestSigner.handler of <botocore.signers.RequestSigner object at 0x7f4839100ee0>>
2023-11-29 00:59:11,217 - MainThread - botocore.hooks - DEBUG - Event choose-signer.s3.PutObject: calling handler <function set_operation_specific_signer at 0x7f483bc8e820>
2023-11-29 00:59:11,217 - MainThread - botocore.hooks - DEBUG - Event before-sign.s3.PutObject: calling handler <function remove_arn_from_signing_path at 0x7f483bc049d0>
2023-11-29 00:59:11,217 - MainThread - botocore.auth - DEBUG - Calculating signature using v4 auth.
2023-11-29 00:59:11,217 - MainThread - botocore.auth - DEBUG - CanonicalRequest:
PUT
/test.txt

content-encoding:aws-chunked
host:test-bucket-az.s3.ap-northeast-1.amazonaws.com
transfer-encoding:chunked
x-amz-content-sha256:STREAMING-UNSIGNED-PAYLOAD-TRAILER
x-amz-date:20231129T005911Z
x-amz-decoded-content-length:5
x-amz-sdk-checksum-algorithm:SHA256
x-amz-security-token:IQoJb3 ... FJNbSZQ==
x-amz-trailer:x-amz-checksum-sha256

content-encoding;host;transfer-encoding;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-security-token;x-amz-trailer
STREAMING-UNSIGNED-PAYLOAD-TRAILER
2023-11-29 00:59:11,218 - MainThread - botocore.auth - DEBUG - StringToSign:
AWS4-HMAC-SHA256
20231129T005911Z
20231129/ap-northeast-1/s3/aws4_request
b12 ... 931
2023-11-29 00:59:11,218 - MainThread - botocore.auth - DEBUG - Signature:
da3 ... 941
2023-11-29 00:59:11,218 - MainThread - botocore.endpoint - DEBUG - Sending http request: <AWSPreparedRequest stream_output=False, method=PUT, url=https://test-bucket-az.s3.ap-northeast-1.amazonaws.com/test.txt, headers={'x-amz-sdk-checksum-algorithm': b'SHA256', 'User-Agent': b'aws-cli/2.9.19 Python/3.9.16 Linux/6.1.61-85.141.amzn2023.x86_64 source/x86_64.amzn.2023 prompt/off command/s3api.put-object', 'Expect': b'100-continue', 'Transfer-Encoding': b'chunked', 'Content-Encoding': b'aws-chunked', 'X-Amz-Trailer': b'x-amz-checksum-sha256', 'X-Amz-Decoded-Content-Length': b'5', 'X-Amz-Date': b'20231129T005911Z', 'X-Amz-Security-Token': b'IQoJb3 ... FJNbSZQ==', 'X-Amz-Content-SHA256': b'STREAMING-UNSIGNED-PAYLOAD-TRAILER', 'Authorization': b'AWS4-HMAC-SHA256 Credential=ASI ... L7S/20231129/ap-northeast-1/s3/aws4_request, SignedHeaders=content-encoding;host;transfer-encoding;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-security-token;x-amz-trailer, Signature=da ... 941'}>
2023-11-29 00:59:11,218 - MainThread - botocore.httpsession - DEBUG - Certificate path: /usr/lib/python3.9/site-packages/awscli/botocore/cacert.pem
2023-11-29 00:59:11,218 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): test-bucket-az.s3.ap-northeast-1.amazonaws.com:443
2023-11-29 00:59:11,326 - MainThread - urllib3.connectionpool - DEBUG - https://test-bucket-az.s3.ap-northeast-1.amazonaws.com:443 "PUT /test.txt HTTP/1.1" 200 0
2023-11-29 00:59:11,326 - MainThread - botocore.parsers - DEBUG - Response headers: {'x-amz-id-2': 'hsM2C/ ... 9w88=', 'x-amz-request-id': '92DYK4N49D9MG071', 'Date': 'Wed, 29 Nov 2023 00:59:12 GMT', 'x-amz-server-side-encryption': 'AES256', 'ETag': '"d8e8fca2dc0f896fd7cb4cb0031ba249"', ★'x-amz-checksum-sha256': '8sobtsfpB9Btr+Roflefznazfk6Tt2BQItpS5szCb9I=', 'Server': 'AmazonS3', 'Content-Length': '0', 'Connection': 'close'}
2023-11-29 00:59:11,327 - MainThread - botocore.parsers - DEBUG - Response body:
b''
2023-11-29 00:59:11,327 - MainThread - botocore.hooks - DEBUG - Event needs-retry.s3.PutObject: calling handler <bound method RetryHandler.needs_retry of <botocore.retries.standard.RetryHandler object at 0x7f48390707c0>>
2023-11-29 00:59:11,327 - MainThread - botocore.retries.standard - DEBUG - Not retrying request.
2023-11-29 00:59:11,327 - MainThread - botocore.hooks - DEBUG - Event needs-retry.s3.PutObject: calling handler <bound method S3RegionRedirectorv2.redirect_from_error of <botocore.utils.S3RegionRedirectorv2 object at 0x7f4839070850>>
2023-11-29 00:59:11,327 - MainThread - botocore.hooks - DEBUG - Event after-call.s3.PutObject: calling handler <function enhance_error_msg at 0x7f483a56e9d0>
2023-11-29 00:59:11,327 - MainThread - botocore.hooks - DEBUG - Event after-call.s3.PutObject: calling handler <bound method RetryQuotaChecker.release_retry_quota of <botocore.retries.standard.RetryQuotaChecker object at 0x7f4839070310>>
2023-11-29 00:59:11,327 - MainThread - awscli.formatter - DEBUG - RequestId: 92DYK4N49D9MG071
{
    "ETag": "\"d8e8fca2dc0f896fd7cb4cb0031ba249\"",
    "ChecksumSHA256": "8sobtsfpB9Btr+Roflefznazfk6Tt2BQItpS5szCb9I=", ★
    "ServerSideEncryption": "AES256"
}

参考

追跡チェックサムの使用
Amazon S3 にオブジェクトをアップロードするときには、オブジェクトの事前計算されたチェックサムを指定するか、AWS SDK を使用して、追跡チェックサムを自動的に作成できます。追跡チェックサムを使用した場合、Amazon S3 は指定されたアルゴリズムを使用してチェックサムを自動的に生成し、それを使用してアップロード中にオブジェクトの整合性を検証します。

AWS SDK を使用しているときに追跡チェックサムを作成するには、ChecksumAlgorithm パラメータに任意のアルゴリズムを指定します。SDK は、そのアルゴリズムを使用してオブジェクト (またはオブジェクトパート) のチェックサムを計算し、アップロードリクエストの最後に自動的に追加します。この動作により、Amazon S3 はデータの検証とアップロードを単一のパスで実行するため、時間を節約できます。

オブジェクトの整合性をチェックする - Amazon Simple Storage Service

スケーラブルなチェックサムの構築 | Amazon Web Services ブログ
1.21.7
======

* api-change:``s3``: [``botocore``] This release adds support for new integrity checking capabilities in Amazon S3. You can choose from four supported checksum algorithms for data integrity checking on your upload and download requests. In addition, AWS SDK can automatically calculate a checksum as it streams data into S3
boto3/CHANGELOG.rst at develop · boto/boto3 · GitHub

x-amz-sdk-checksum-algorithm
Indicates the algorithm used to create the checksum for the object when using the SDK. This header will not provide any additional functionality if not using the SDK. When sending this header, there must be a corresponding x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the request with the HTTP status code 400 Bad Request. For more information, see Checking object integrity in the Amazon S3 User Guide.

If you provide an individual checksum, Amazon S3 ignores any provided ChecksumAlgorithm parameter.

Valid Values: CRC32 | CRC32C | SHA1 | SHA256
PutObject - Amazon Simple Storage Service

Amazon Keyspaces の Auto Scaling でスケールアウトするまでの所要時間

Amazon Keyspaces の Auto Scaling でスケールアウトするまでの所要時間を実測してみた。
キャパシティモードがプロビジョンドのテーブル最小 RCU/WCU: 2000、最大 RCU/WCU: 20,000、目標使用率: 70% に対して、YCSB から負荷をかけてみて、3〜4分程度でAuto Scaling が発動した。

検証結果

  • プロビジョンしたキャパシティを超えて3〜4分程度で Auto Scaling が発動し、そこから4分程度でスケールアウトがスループットに追いついている。


前提

Amazon Keyspaces
  • テーブルを作成する
$ cqlsh cassandra.ap-northeast-1.amazonaws.com 9142 --ssl
cqlsh> create keyspace ycsb
    WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 3 };
cqlsh> USE ycsb;
cqlsh> create table usertable (
    y_id varchar primary key,
    field0 varchar,
    field1 varchar,
    field2 varchar,
    field3 varchar,
    field4 varchar,
    field5 varchar,
    field6 varchar,
    field7 varchar,
    field8 varchar,
    field9 varchar);
  • テーブルのキャパシティ設定
    • キャパシティモード: プロビジョンド
    • 詠み込みキャパシティー
      • 自動スケーリング: チェック
      • 最小キャパシティユニット: 2,000
      • 最大キャパシティユニット: 20,000
      • 目標使用率(%): 70
    • 書き込みキャパシティー

EC2 から YCSB で負荷をかける
  • EC2
  • ~/YCSB/workloads/workloadb_keyspaces
recordcount=100000
operationcount=1000000
workload=site.ycsb.workloads.CoreWorkload

readallfields=true

readproportion=0.95
updateproportion=0.05
scanproportion=0
insertproportion=0

requestdistribution=uniform
  • データをロードする
$ cd ~/YCSB/ 
$ ./bin/ycsb load cassandra-cql -p hosts=cassandra.ap-northeast-1.amazonaws.com -p port=9142 -P ./workloads/workloada_keyspaces -s \
-threads 8 -p cassandra.writeconsistencylevel=LOCAL_QUORUM -p cassandra.ssl=true \
-jvm-args=" -Djavax.net.ssl.trustStore=/home/ec2-user/.cassandra/cassandra_truststore.jks -Djavax.net.ssl.trustStorePassword=amazon"
  • 負荷をかける
$ cd ~/YCSB/ 
$ ./bin/ycsb run cassandra-cql -p hosts=cassandra.ap-northeast-1.amazonaws.com -p port=9142 -P ./workloads/workloada_keyspaces -s \
-threads 100 -p cassandra.writeconsistencylevel=LOCAL_QUORUM -p cassandra.ssl=true \
-p cassandra.coreconnections=100 -p cassandra.maxconnections=100 \
-jvm-args=" -Djavax.net.ssl.trustStore=/home/ec2-user/.cassandra/cassandra_truststore.jks -Djavax.net.ssl.trustStorePassword=amazon"