2023/11 CTOへの日報まとめ

日報




2023-11-01

CloudFormationにおける「ドリフト」という概念を知ることができました。

  • ドリフトとは、CloudFormationスタックの定義(テンプレート)と実際のリソースの状態との間に生じる差異のこと
  • CloudFormationで作成や管理されるリソースに対して、手動で変更を加えた場合などに、このドリフトが生じることがある(例:CloudFormationテンプレートで、EC2インスタンスのタイプをt2.microとして定義した後、AWS Management ConsoleやCLIを使用して、手動でt2.largeに変更した場合など)
  • CloudFormationには、ドリフト検出機能があり、実際のAWSリソースとCloudFormationテンプレートとの間のドリフトを検出することができる。この機能を使用すると、意図しない変更や構成のズレを迅速に確認できるため、環境の整合性を維持するのに役立つ。
  • ドリフトの概念は、Infrastructure as Code (IaC) の哲学において重要
  • IaCの考え方として、インフラの状態はコード(この場合、CloudFormationテンプレート)で定義されるべきであり、手動での変更は避けるべきとされている
  • ドリフト検出を利用することで、この哲学を実践し、インフラの整合性と一貫性を保つことができる
2023-11-02

Pythonにおいて、import requestsによりインポートされるrequestsライブラリについて理解することができました

  • requestsライブラリとは、PythonでのHTTP通信をシンプルかつ人間が読みやすい方法で行うための外部ライブラリ
  • requestsを使用することで、ウェブサイトへのアクセス、APIの呼び出し、データのアップロード・ダウンロードなどのHTTPリクエストを簡単に実行することができる
  • HTTP通信のためのPythonの標準ライブラリよりも直感的で使いやすいため、多くの開発者に広く利用されている

requestsライブラリの主な機能と特徴

  • GETリクエストやPOSTリクエスト:ウェブサイトのコンテンツを取得したり、フォームデータやJSONデータをサーバーに送信するためのメソッドが提供されている
  • レスポンスの処理:レスポンス内容をテキストやバイナリデータとして簡単に取得可能
  • JSON対応:JSONレスポンスを自動的にPythonの辞書に変換する機能がある
  • セッションのサポート:ログイン情報やクッキーを維持して、複数のリクエスト間で情報を共有することができる
  • HTTPSサポート:セキュアな通信のためのSSL/TLSサポートが組み込まれている
  • カスタムヘッダーやクエリパラメータ:リクエストヘッダーやURLのクエリパラメータを簡単に指定することができる

requestsを使って特定のURLから内容を取得する基本的なコードは、下記のようになる
import requests
response = requests.get(‘https://www.example.com’)
print(response.text)

2023-11-06

DynamoDBの属性に付与可能なHASH(パーティションキー)とRANGE(ソートキー)について理解することができました。

HASH(パーティションキー)について

  • パーティションキーの値は内部的にハッシュ関数によって変換され、その結果に基づいてデータがストレージ内の様々なパーティションに分散される

RANGE(ソートキー)について

  • ソートキーを使用すると、パーティションキーが同じ値を持つ項目を論理的にグループ化し、ソートキーの値で順序付けをすることが可能
  • これにより、パーティションキーが同じでも、ソートキーが異なる複数の項目を持つことができる

DynamoDBでは、RDBにおけるidカラムのように、1つのカラム(DynamoDBにおける属性)にauto_incrementを付与し、各レコード(DynamoDBにおけるアイテム)の一意性を保証することはできないようでした。DynamoDBでは、HASHまたはHASH&RANGEの組み合わせにより、アイテムの一意性を保証するようです。このようなことから、媒体Gでは下記の構造を持ったテーブルを作成しました。HASH&RANGEの組み合わせにより、アイテムの一意性を保証するようにしました。

  • company_id:HASHを付与。これにより企業毎にグループ化が可能
  • entity_id:RANGEを付与。媒体Gでは1人の候補者が同一企業の複数求人にエントリー可能。そのため、アイテムの一意性を保証する属性を別途用意。pythonのuuidモジュールをインポートし、uuid.uuid4()により生成されたユニークな値をinsertする
  • user_id:候補者id
  • job_offer_name:求人名
2023-11-07

Pythonにおいて、import shutilによりインポートされるshutil(shell utilities)(シューティル)モジュールについて理解しました

  • shutil(shell utilities)モジュールは、高レベルのファイルおよびディレクトリ操作のためのユーティリティ関数を提供している
  • ファイルやディレクトリの操作を行うための豊富なツールセットを提供しており、OSモジュールと組み合わせることで、様々なファイルシステムのタスクを効率的に実行することが可能

主な操作は下記

  • ファイルのコピー:shutil.copy(src, dst) により、 src から dst へファイルをコピーする
  • ディレクトリのコピー:shutil.copytree(src, dst) により、srcディレクトリとその内容を dstへ再帰的にコピーする
  • ファイルおよびディレクトリの移動:shutil.move(src, dst) により、src を dst へ移動する。これはリネームとしても機能する
  • ファイルおよびディレクトリの削除:shutil.rmtree(path) は pathディレクトリとその内容を再帰的に削除する
  • ディスク使用量の取得:shutil.disk_usage(path) は指定されたパスのディスク使用量に関する情報を返す
  • アーカイブの作成と展開:shutil は .zip, .tar などの一般的なアーカイブ形式の作成と展開のサポートも提供する
2023-11-08

from boto3.dynamodb.conditions import Keyによってインポートされる、boto3ライブラリのdynamodb.conditionsモジュールのKeyクラスについて理解しました。

  • dynamodb.conditionsモジュールは、DynamoDBを利用する際に、クエリやスキャンの条件を定義するためのユーティリティを提供する
  • Keyクラスは、その条件定義のためのクラスの一つ
  • このクラスを使うことで、特定の属性に対しての条件をプログラム的に指定することが可能

下記は、Keyクラスを使用してDynamoDBのテーブルから特定の条件に合致する項目をクエリする簡単な例

# DynamoDBのリソースを取得
dynamodb = boto3.resource(‘dynamodb’)
table = dynamodb.Table(‘TableName’)
# “PrimaryKeyName” が “SomeValue” に等しい項目をクエリ
response = table.query(
KeyConditionExpression=Key(‘PrimaryKeyName’).eq(‘SomeValue’)
)
# クエリ結果を表示
print(response[‘Items’])

2023-11-09

Pythonにおいて、import tracebackによりインポートされるtracebackモジュールについて理解することができました。

  • tracebackモジュールとは、Pythonで例外が発生した際のスタックトレースを取得、表示、操作するためのユーティリティを提供している
  • 例外が発生した場合に、tracebackモジュールを使用して、その例外がどのように発生したのかを示すスタックトレースを取得することができる
  • スタックトレースの情報を様々なフォーマットで出力することができる。これにより、デバッグやエラーログの記録が簡単になる
  • 現在のコールスタックを取得し、その情報を分析することができる

簡単な例
import traceback
try:
1 / 0
except ZeroDivisionError:
print(“An error occurred!”)
traceback.print_exc() # この行で例外のスタックトレースが表示される

上記のコードを実行すると、「An error occurred!」の後に、ZeroDivisionErrorのスタックトレースが表示される。

2023-11-10

from typing import List によってインポートされるtypingモジュールのListについて理解することができました。

  • typingモジュールとは、Pythonの型ヒントや型アノテーションをサポートするためのモジュール。複雑なデータ構造や関数のシグネチャを明示的に表現するのに役立つ
  • 型ヒントとは、Pythonコードの可読性向上に貢献したり、静的型チェックツール(mypy)を使用してコードの型安全性を検証するために使用される
  • Listは、型ヒントの中の一つで、リストの内容の型を指定するために使用される

Listを使用した簡単な例

from typing import List
def sum_numbers(numbers: List[int]) -> int:
return sum(numbers)
result = sum_numbers([1, 2, 3, 4])
print(result) # 10

上記のコードでは、sum_numbers関数はList[int]という型ヒントを持っており、これはこの関数が整数のリストを引数として受け取ることを示している。また、-> int は関数の返り値が整数であることを示している。

2023-11-13

import copyによりインポートされるcopyモジュールの概念の1つである浅いコピー(shallow copy)と深いコピー(deep copy)について理解することができました。

import copy
lst1 = [[1, 2, 3], [4, 5, 6]] # ネストされたリスト

lst2 = copy.copy(lst1) # 浅いコピーの作成
lst2[0][0] = 99
print(lst1) # [[99, 2, 3], [4, 5, 6]] と表示される。lst2の変更がlst1にも影響

lst3 = copy.deepcopy(lst1) # 深いコピーの作成
lst3[0][0] = 11
print(lst1) # [[99, 2, 3], [4, 5, 6]] と表示される。lst3の変更がlst1に影響しない

浅いコピーと深いコピーの機能は、特にミュータブルなオブジェクト(リストや辞書)をコピーする際に便利。

2023-11-14

なんとなく気になったので、AWSのAthenaについて調べました。概要だけですが、概要を知ることが出来ました。

  • Athenaとは、AWSが提供するサーバーレスのインタラクティブなクエリサービス
  • Athenaを使用すると、Amazon S3に保存されている大量のデータに対して、標準SQLを使用して簡単に分析を行うことができる
  • Athenaは、Prestoという分散SQLクエリエンジンを利用しており、大量のデータに対して高速な分析を行うことができる
  • Athenaは、Amazon S3上の様々なファイル形式(例:CSV, Parquet, ORCなど)に対してクエリを実行することができる
  • 使い方としては、まずAthenaコンソールまたはAPIを使用してSQLクエリを実行する。次に、AthenaはAmazon S3上のデータを直接スキャンし、結果を返す。この結果は、指定されたS3バケットにも保存されるため、後から再度確認することが可能
  • 大量のデータを持つ企業や組織が、迅速にインサイトを得るための分析を行いたい場合、Athenaは非常に有効なツールとなる
2023-11-16

サービス提供時に使用される、品質やパフォーマンス、契約に関する指標や目標、約束を意味する3つの概念について理解することができました。

SLI(Service Level Indicator)とは、システムが正常にサービスを提供できているかの指標のこと。例えば、とあるAPIリクエストを正常に処理できた割合。

SLO(Service Level Objective)とは、SLIの目標(内部目標)のこと。例えば「とあるAPIが1ヶ月で99.999%のリクエストを正常に処理する」など

SLA(Service Level Agreement)とは、SLIの約束(外部に対しての品質保証)のこと。例えば「とあるAPIが1ヶ月で99.99%以上のリクエストを正常に処理できなかった場合、当月料金の30%を返金します」など

一般的には、SLO > SLA

2023-11-18

スロットリングという用語について知ることができました。

スロットリングとは、システムの過負荷や特定利用者による資源の独占を回避するために、一定の制限値を超えた場合に意図的に性能を低下させたり、要求を一時的に拒否したりする制御のこと。

2023-11-20

システム設計の考え方である「データ中心アプローチ(DOA)」と「プロセス中心アプローチ(POA)」について理解しました。

  • データ中心アプローチ(DOA)とは、どのようなデータを利用するか、またその扱い方を考えてから処理を書きだすアプローチのこと。現在、主流のシステム設計方法。
  • プロセス中心アプローチ(POA)とは、処理を先に洗い出し、その後データを設計するアプローチのこと。

処理はデータと比較し、実装の段階で変更が加えられやすいため、処理を先に定義して、その結果に基づいてデータを決めるのは非効率である。処理内容の変更は容易だが、データ定義の変更は難しく、データ定義はシステムのパフォーマンスに直結するため、データ設計が優先されるDOAが現在は主流である。

2023-11-21

第3正規形での問題点について理解しました。

  • 第3正規形まで進めると、テーブルを効率的に分割することができ、テーブル構造が分かりやすくなる
  • 総データ量を抑えることもできる
  • しかし、テーブルの結合が多く発生し、処理時間が増える可能性がある。テーブル結合は一般的に処理時間が長い。
  • 数十万以下のレコード量までなら、あまり気にせず第3正規形まで行って良いが、パフォーマンスの問題が起きた場合は、正規形を無視してカラムを追加した方が良い
2023-11-22

ルーティング技術の1つであるECMP(Equal Cost Multi Path)について、概要を理解することができました。

  • ECMPとは、ネットワーク的に同じコストの経路が複数あった場合に、複数経路にパケットを転送し、負荷分散を実現するルーティング技術の1つ
  • 複数の同コストのパスを使用してネットワークトラフィックを均等に分散することで、単一のリンクやパスにトラフィックが集中するのを防ぎ、全体的なネットワーク性能の向上に繋がる
  • また、あるパスが障害を起こした場合、ECMPは他の動作しているパスを使用してトラフィックを転送し続けることが可能。これにより、ネットワークのダウンタイムが低減され、高い可用性が確保される
2023-11-24

DBのviewを利用する上での注意点を知ることが出来ました。

  • viewであることが分かる名前をつける(_view等)
  • サブクエリの中などは除き、where句やorder by句は使用しない。viewの汎用性が下がるため。viewを実行する際にwhereやorder byを付与することはできるため、そのような個別のクエリで対応する。例、select * from customers_payments_view where column = “〇〇”; select * from customers_payments_view order by column;
  • パフォーマンスの観点から、viewでviewを定義,呼ぶことはしない(viewの入れ子は防ぐ)
2023-11-27

AWSのEFSがどのようなサービスか、概要を知ることができました

  • AWSのElastic File System
  • クラウドベースのファイルストレージサービス
  • NFSv4プロトコルを使用して、複数のEC2インスタンスやAWSサービスから同時にアクセスすることができる、スケーラブルなファイルストレージ

主な特徴

  • 完全マネージド:サーバーのプロビジョニング、パッチ適用、バックアップなどの管理タスクを手動で行う必要がない
  • データは複数のAZに同時に保存されるため、高い耐久性がある
  • 複数のEC2インスタンスから同時にファイルにアクセスすることができる。これにより、共有データセットを持つアプリケーションやワークロードに適している(ウェブサイトのコンテンツやメディアファイルを保存し、複数のサーバーで共有する用途)
  • VPC内からのアクセス、IAMポリシー、ネットワークアクセス制御リスト、暗号化などのセキュリティ機能がサポートされている
2023-11-28

AWSのSESがどのようなサービスか知らなかったので調べました。概要を知ることができました。

  • AWSのSimple Email Service
  • クラウドベースのメール送受信サービスであり、アプリケーションやウェブサービスからのメール送受信に特化している
  • トランザクションメール(購入の確認メール等)やマーケティングコミュニケーション(ニュースレターやプロモーションメール)、システム通知(アラートや通知)によく用いられる
  • ある条件に基づいてメールを受信し、Amazon S3やAmazon Lambdaなどの他のAWSサービスにメール内容を渡すことも可能
  • メール送信に関する多くの側面(送信管理、配信率の最適化、スパム対策など)を手間なく扱うことができるサービス

主な機能や特徴

  • 高い配信率:SESは多くのメジャーISPとの関係を持ち、高いメール配信率を確保する
  • スケーラビリティ:大量のメールを短時間に送信することができる
  • フレキシビリティ:SMTPインターフェースやAWS SDKを使って、様々なアプリケーションやプラットフォームからメールを送信することができる
  • 内容フィルタリング:メールの内容をスキャンして、スパムやマルウェアを含むメールを検出する機能がある
  • 統合:AWSの他のサービス(S3, Lambda, SNSなど)との統合が容易
2023-11-29

ログ出力時に使用しているPythonの標準ライブラリの1つであるsysモジュールについて、他に便利な使い方がないか調べてみました。

sysモジュールとは、Pythonインタプリタとその環境(特にシステム固有のパラメータや関数)に密接にアクセスするための関数と変数を提供するPythonの標準ライブラリ

スクリプトの終了

  • sys.exit() # 通常の終了
  • sys.exit(1) # エラーコード1で終了

インタプリタ情報取得

  • print(sys.version) # Pythonのバージョン文字列を表示
  • print(sys.platform) # 実行しているプラットフォームを示す文字列を表示(’linux’, ‘win32’ など)

標準入出力、エラー出力の制御

  • sys.stdin # 標準入力を表すオブジェクト
  • sys.stdout # 標準出力を表すオブジェクト
  • sys.stderr # 標準エラー出力を表すオブジェクト