{Azure Storage}ライフサイクル管理ポリシーを構成する

 

https://learn.microsoft.com/ja-jp/azure/storage/blobs/lifecycle-management-policy-configure?tabs=azure-cli

https://learn.microsoft.com/ja-jp/azure/storage/blobs/lifecycle-management-overview

https://www.tama-negi.com/2021/10/09/azure-storage-lifecycle-management/


次のいずれかの条件をチェックすることを選択できます。

BLOB が作成された後の日数。
BLOB が最後に変更された後の日数。
BLOB が最後にアクセスされた後の日数。 (アクセス時間の追跡を有効にする必要があります。)

ポリシーの構成後、有効になるまでに最大 24 時間かかることがあります。
ポリシーの有効化後、アクションが最初に実行されるまでに最大で 24 時間かかることがあります。


最後のアクセスから1日後に削除されるポリシーを作成


-- 1. 前作業

az login --use-device-code
az account show

az version

az configure --list-defaults
az configure --defaults location=japaneast
az configure --list-defaults

az group create \
--name rg9999999 \
--location japaneast


az group list
az upgrade


-- 2. ストレージアカウントの作成

az storage account create \
--resource-group rg9999999 \
--name st123 \
--access-tier Hot \
--kind StorageV2 \
--sku Standard_LRS


az storage account list \
--resource-group rg9999999


-- 3. アクセス時間の追跡を有効にする

az storage account blob-service-properties update \
--resource-group rg9999999 \
--account-name st123 \
--enable-last-access-tracking true

az storage account blob-service-properties show \
--resource-group rg9999999 \
--account-name st123

 

-- 4. コンテナーの作成

key=$(az storage account keys list \
--account-name st123 \
--resource-group rg9999999 \
--output json \
--query [0].value | tr -d '"')

echo $key

az storage container create \
--name container01 \
--account-name st123 \
--public-access off \
--account-key $key


az storage container list \
--account-name st123 \
--account-key $key

-- 5. コンテナーにオブジェクトをアップロード

echo test > test.txt

az storage blob upload \
--account-name st123 \
--container-name container01 \
--name test.txt \
--file test.txt \
--account-key $key

az storage blob list \
--account-name st123 \
--container-name container01 \
--output table \
--account-key $key


az storage blob download \
--account-name st123 \
--container-name container01 \
--name test.txt \
--file test.txt \
--account-key $key

 

az storage blob show \
--account-name st123 \
--container-name container01 \
--name test.txt \
--account-key $key

lastAccessedOnを確認


-- 6. ライフサイクル管理ポリシーを作成

vim policy.json

{
  "rules": [
     {
        "name": "policy01",
        "type": "Lifecycle",
        "enabled": true,
        "definition": {
          "filters": {
            "blobTypes": [ "blockBlob" ]
          },
          "actions": {
            "baseBlob": {
              "delete": {
                "daysAfterLastAccessTimeGreaterThan": 1
              }
            }
          }
        }
     }
   ]
}


cat policy.json

 

az storage account management-policy create \
--resource-group rg9999999 \
--account-name st123 \
--policy @policy.json

 

az storage account management-policy show \
--resource-group rg9999999 \
--account-name st123

 

 


-- 7. 動作確認

1-2日待つ。BLOBが削除されていることを確認

 

key=$(az storage account keys list \
--account-name st123 \
--resource-group rg9999999 \
--output json \
--query [0].value | tr -d '"')

echo $key

az storage blob list \
--account-name st123 \
--container-name container01 \
--output table \
--account-key $key


-- 8. クリーンアップ

az storage account delete \
--resource-group rg9999999 \
--name st123 \
--yes


az group list
az group delete \
--name rg9999999 \
--yes

 

 

{GCP Cloud Storage}オブジェクトのライフサイクル管理

 

https://cloud.google.com/storage/docs/lifecycle?hl=ja

https://cloud.google.com/storage/docs/managing-lifecycles?hl=ja

https://dev.classmethod.jp/articles/gcs_lifecycle/


ライフサイクル ルールには、次のアクションのいずれか 1 つのみを指定します。
Delete
SetStorageClass
AbortIncompleteMultipartUpload


ライフサイクル ルールでは、次の条件がサポートされています。
age
createdBefore
customTimeBefore
daysSinceCustomTime
daysSinceNoncurrentTime
isLive
matchesStorageClass
matchesPrefix と matchesSuffix
noncurrentTimeBefore
numNewerVersions

ライフサイクルの構成を変更した場合、変更後 24 時間が経過するまで、
オブジェクトのライフサイクル管理が古い構成を使用して操作を実行する可能性があります。


Age is measured from the resource's creation time.
For objects, the creation time is the time when the object is successfully written to the bucket, such as when an upload completes.


age条件で1日経過後に削除するポリシーを作成

 

-- 1. 前作業

gcloud init
gcloud auth list

gcloud --version

gcloud projects create project01-9999999 \
--name="project01"

gcloud config list
gcloud config set project project01-9999999
gcloud config set compute/region asia-northeast1 --quiet
gcloud config set compute/zone asia-northeast1-a --quiet

gcloud beta billing accounts list
gcloud beta billing projects link project01-9999999 --billing-account=111111-111111-111111

gcloud services enable compute.googleapis.com --project project01-9999999

gcloud components update

-- 2. バケットの作成

gcloud storage buckets create gs://bucket123 \
--default-storage-class=Standard \
--no-enable-autoclass \
--location=asia-northeast1 \
--public-access-prevention \
--uniform-bucket-level-access

gcloud storage ls


-- 3. ファイルのアップロード


echo test > test.txt
gcloud storage cp test.txt gs://bucket123

gcloud storage ls --long gs://bucket123/*

 

-- 4. バケットのライフサイクル構成を設定する


vim policy.json

{
  "lifecycle": {
    "rule": [
      {
        "action": {"type": "Delete"},
        "condition": {
          "age": 1
        }
      }
    ]
  }
}

cat policy.json

gcloud storage buckets update gs://bucket123 --lifecycle-file=policy.json

gcloud storage buckets describe gs://bucket123
gcloud storage buckets describe gs://bucket123 --format="default(lifecycle)"

 

-- 5. 動作確認


gcloud storage ls --long gs://bucket123/*

1-2日待つ。BLOBが削除されていることを確認


-- 6. クリーンアップ

gcloud storage rm gs://bucket123 --recursive
gcloud storage ls

 

gcloud projects list

gcloud projects delete project01-9999999 \
--quiet

 

Redisコマンド

前提
OS : Rocky Linux 9.1
Redis version : 6.2.7

redis-cli

Sring型

set key01 val01
get key01

unlink key01
get key01

mset key11 val11 key12 val12
mget key11 key12


set counter01 0
incr counter01
get counter01
decr counter01
get counter01


List型

lpush key21 val21
lpush key21 val22
rpush key21 val23
rpush key21 val24

lrange key21 0 -1

lpop key21
lrange key21 0 -1
rpop key21
lrange key21 0 -1

unlink key21
lrange key21 0 -1


Hash型

hset hash01 key31 val31 key32 val32
hset hash01 key33 val33

hgetall hash01
hget hash01 key31

hkeys hash01
hvals hash01

hdel hash01 key31
hgetall hash01

unlink hash01
hgetall hash01


Set型

sadd key41 val41 val42
sadd key41 val42
sadd key41 val43

smembers key41

srem key41 val41
smembers key41

unlink key41
smembers key41


Sorted Set型

zadd key51 10 val51
zadd key51 20 val52
zadd key51 30 val53

zrange key51 0 -1
zrange key51 0 -1 withscores

zrange key51 -inf +inf byscore withscores
zrange key51 +inf -inf byscore rev withscores


zrem key51 val51
zrange key51 0 -1

unlink key51
zrange key51 0 -1

 

DB内の全キー削除
keys *
flushdb async
keys *

 

サーバー情報取得
info


スナップショット取得

redis-cli dbsize
redis-cli bgsave
redis-cli lastsave

date --date "@$(redis-cli lastsave)" "+%Y/%m/%d %H:%M:%S"

ls -l /var/lib/redis/dump.rdb
cp -a /var/lib/redis/dump.rdb /tmp/dump.rdb.bk20220103
ls -l /tmp/dump.rdb.bk20220103

redis-check-rdb /tmp/dump.rdb.bk20220103


リストア

systemctl stop redis

ls -l /var/lib/redis/dump.rdb
cp -a /tmp/dump.rdb.bk20220103 /var/lib/redis/dump.rdb
ls -l /var/lib/redis/dump.rdb

systemctl start redis

 

スローログ

https://tsunokawa.hatenablog.com/entry/2016/08/18/191231

config get slowlog-log-slower-than
config get slowlog-max-len

config set slowlog-log-slower-than 0
config set slowlog-max-len 1000

slowlog get 3

自動採番されたID
コマンド実行時のUnixタイムスタンプ
コマンド実行にかかった時間、マイクロ秒単位
コマンドとそのパラメータ


slowlog len
slowlog reset


トランザクション

set counter01 0
get counter01

multi
set counter01 10
incr counter01
incr counter01
get counter01
exec
get counter01


set counter02 0
get counter02

multi
set counter02 10
incr counter02
incr counter02
get counter02
discard
get counter02

 

{GCP Dataflow}Pub/Sub から BigQuery へのストリーミング

 

https://cloud.google.com/dataflow/docs/tutorials/dataflow-stream-to-bigquery?hl=ja

https://marketingengineercareer.com/google-cloud-dataflow

https://cloud.google.com/bigquery/docs/creating-partitioned-tables?hl=ja#bq

https://cloud.google.com/sdk/gcloud/reference/dataflow/jobs/run


Pub/Sub -> Storage -> Dataflow -> Bigquery


asia-northeast1で実施したところ、ジョブがゾーンのリソース不足エラーとなったので、
us-central1
で実施する

 

-- 1. 前作業

gcloud init
gcloud auth list

gcloud --version

gcloud projects create project01-9999999 \
--name="project01"

gcloud config list
gcloud config set project project01-9999999
gcloud config set compute/region us-central1 --quiet
gcloud config set compute/zone us-central1-a --quiet

gcloud beta billing accounts list
gcloud beta billing projects link project01-9999999 --billing-account=111111-111111-111111

gcloud services enable compute.googleapis.com --project project01-9999999

gcloud components update

gcloud auth application-default login


-- 2. APIの有効化


gcloud services list --enabled
gcloud services list --available

gcloud services enable dataflow.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable storage-api.googleapis.com
gcloud services enable pubsub.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com
gcloud services enable cloudscheduler.googleapis.com

 


-- 3. トピックの作成

gcloud pubsub topics create topic01

gcloud pubsub topics list


-- 4. サブスクリプションの作成

gcloud pubsub subscriptions create ss01 \
--topic=topic01

gcloud pubsub subscriptions list

 


-- 5. Cloud Storage バケットを作成する

gcloud storage buckets create gs://bucket123 \
--default-storage-class=Standard \
--no-enable-autoclass \
--location=us-central1 \
--public-access-prevention \
--uniform-bucket-level-access

gcloud storage ls


-- 6. Bigqueryデータセットを作成する

bq mk ds01

bq ls


-- 7. Bigqueryデータセットにテーブルを作成する


bq mk \
--table \
--schema 'col1:DATE,col2:STRING' \
--time_partitioning_field col1 \
--time_partitioning_type DAY \
ds01.tab1

bq ls ds01
bq show ds01.tab1


-- 8. Dataflowを起動する

※staging-location : 一時ファイルを書き込むためのパスとファイル名の接頭辞。例: gs://your-bucket/temp


gcloud dataflow jobs run job01 \
--gcs-location gs://dataflow-templates-us-central1/latest/PubSub_to_BigQuery \
--region us-central1 \
--staging-location gs://bucket123/temp \
--parameters inputTopic=projects/project01-9999999/topics/topic01,outputTableSpec=project01-9999999:ds01.tab1


gcloud dataflow jobs list \
--region us-central1


gcloud dataflow jobs describe 2023-01-02_19_03_42-111111111111111111 \
--region us-central1

 


-- 9. データを手動でPublish

gcloud pubsub topics publish topic01 \
--message='{"col1":"2022-01-01","col2":"val2"}'


しばらく待つ


-- 10. BigQueryにデータが入っているか確認する

bq query --use_legacy_sql=false \
'select * from ds01.tab1;'

 

 

-- 11. クリーンアップ

gcloud dataflow jobs list \
--region us-central1


gcloud dataflow jobs cancel 2023-01-02_19_03_42-111111111111111111


bq rm --recursive=true --force ds01
bq ls


gcloud storage rm gs://bucket123 --recursive
gcloud storage ls

gcloud pubsub subscriptions delete ss01

gcloud pubsub topics delete topic01

 

gcloud projects list
gcloud projects delete project01-9999999 \
--quiet

 

{Azure Event Hubs}クイック スタート: Azure CLI を使用したイベント ハブの作成

 

https://learn.microsoft.com/ja-jp/azure/event-hubs/event-hubs-quickstart-cli

 

Azure Event Hubs はビッグ データ ストリーミング プラットフォームであり、毎秒数百万のイベントを受け取って処理できるイベント インジェスト サービスです

 

-- 1. 前作業

az login --use-device-code
az account show

az version

az configure --list-defaults
az configure --defaults location=japaneast
az configure --list-defaults

az group create \
--name rg9999999 \
--location japaneast


az group list
az upgrade


-- 2. Event Hubs用の Python パッケージのインストール

pip install azure-eventhub
pip install azure-eventhub-checkpointstoreblob-aio


-- 3. ストレージアカウントとBLOBコンテナーの作成

az storage account create \
--resource-group rg9999999 \
--name st123 \
--access-tier Hot \
--kind StorageV2 \
--sku Standard_LRS

az storage account list \
--resource-group rg9999999

 


key=$(az storage account keys list \
--account-name st123 \
--resource-group rg9999999 \
--output json \
--query [0].value | tr -d '"')

echo $key


az storage container create \
--name container01 \
--account-name st123 \
--public-access off \
--account-key $key

az storage container list \
--account-name st123 \
--account-key $key


-- 4. 接続文字列を取得

connectionString=$(az storage account show-connection-string \
--resource-group rg9999999 \
--name st123 \
--query connectionString \
--output tsv )

echo $connectionString

 

-- 5. Event Hubs名前空間の作成


az eventhubs namespace create \
--resource-group rg9999999 \
--name ns123 \
--sku Basic

az eventhubs namespace list \
--resource-group rg9999999

 

-- 6. Event Hubsの作成

az eventhubs eventhub create \
--resource-group rg9999999 \
--namespace-name ns123 \
--name hub01 \
--message-retention 1

 

az eventhubs eventhub list \
--resource-group rg9999999 \
--namespace-name ns123

 

-- 7. Event Hubs名前空間用の接続文字列を取得

az eventhubs namespace authorization-rule keys list \
--resource-group rg9999999 \
--namespace-name ns123 \
--name RootManageSharedAccessKey

 


-- 8. イベントを送信する Python スクリプトの作成

vim send.py

import asyncio
from azure.eventhub.aio import EventHubProducerClient
from azure.eventhub import EventData

async def run():
    # Create a producer client to send messages to the event hub.
    # Specify a connection string to your event hubs namespace and
    # the event hub name.
    producer = EventHubProducerClient.from_connection_string(conn_str="Endpoint=sb://ns123.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", eventhub_name="hub01")
    async with producer:
        # Create a batch.
        event_data_batch = await producer.create_batch()

        # Add events to the batch.
        event_data_batch.add(EventData('First event '))
        event_data_batch.add(EventData('Second event'))
        event_data_batch.add(EventData('Third event'))

        # Send the batch of events to the event hub.
        await producer.send_batch(event_data_batch)

loop = asyncio.get_event_loop()
loop.run_until_complete(run())

 

-- 9. イベントを受信する Python スクリプトの作成

vim recv.py

import asyncio
from azure.eventhub.aio import EventHubConsumerClient
from azure.eventhub.extensions.checkpointstoreblobaio import BlobCheckpointStore


async def on_event(partition_context, event):
    # Print the event data.
    print("Received the event: \"{}\" from the partition with ID: \"{}\"".format(event.body_as_str(encoding='UTF-8'), partition_context.partition_id))

    # Update the checkpoint so that the program doesn't read the events
    # that it has already read when you run it next time.
    await partition_context.update_checkpoint(event)

async def main():
    # Create an Azure blob checkpoint store to store the checkpoints.
    checkpoint_store = BlobCheckpointStore.from_connection_string("DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=st123;AccountKey=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy;BlobEndpoint=https://st123.blob.core.windows.net/;FileEndpoint=https://st123.file.core.windows.net/;QueueEndpoint=https://st123.queue.core.windows.net/;TableEndpoint=https://st123.table.core.windows.net/", "container01")

    # Create a consumer client for the event hub.
    client = EventHubConsumerClient.from_connection_string("Endpoint=sb://ns123.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", consumer_group="$Default", eventhub_name="hub01", checkpoint_store=checkpoint_store)
    async with client:
        # Call the receive method. Read from the beginning of the partition (starting_position: "-1")
        await client.receive(on_event=on_event,  starting_position="-1")

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    # Run the main method.
    loop.run_until_complete(main())


-- 10. 動作確認

python recv.py

python send.py


-- 11. クリーンアップ


az eventhubs eventhub delete \
--resource-group rg9999999 \
--namespace-name ns123 \
--name hub01


az eventhubs namespace delete \
--resource-group rg9999999 \
--name ns123

 

az group list
az group delete \
--name rg9999999 \
--yes