2023/10 CTOへの日報まとめ

日報




2023-10-02

Header Injection(ヘッダインジェクション)という攻撃を知りました。

Header Injection(ヘッダインジェクション)とは、攻撃者が不正なHTTPヘッダーの値を挿入または変更することによって行う攻撃のこと。この攻撃により、攻撃者は下記を実現することができる。

  • セッションハイジャック
  • 不正な内容をキャッシュに保存させることによる、キャッシュポイズニング
  • Locationヘッダーをいじることによる、意図しないリダイレクト
2023-10-03

クライアントサイドロードバランシングという負荷分散方法を知りました。

  • クライアント側で接続先の候補を知っておき、接続時にどのサーバーを使用するか切り替える
  • ロードバランサーが不要
  • クライアント側にロードバランシングのロジックを持たせるため、クライアント側で接続先の死活監視やサービスディスカバリのような仕組みが必要になる
2023-10-04

サービスディスカバリ(Service Discovery)という概念を知りました。

サービスディスカバリとは、分散システムやマイクロサービスアーキテクチャにおいて、動的にサービスの場所や存在を識別・探索するプロセスやメカニズムのこと。大規模で動的なマイクロサービス環境では、各サービスは独立してスケールされ、異なるホストやポートで実行されることが多いため、サービス間の通信を簡単かつ効率的に行うための重要な概念。サービスディスカバリには、主に2つのアプローチがある。

1. クライアントサイドのディスカバリ

  • クライアントが直接サービスディスカバリの機構に問い合わせて、対象となるサービスの場所を見つけ出す
  • クライアントは得られた情報(例:IPアドレスとポート)を使用してサービスに直接リクエストを行う

2. サーバーサイドのディスカバリ

  • クライアントは固定のエンドポイント(例:ロードバランサー)にリクエストを送る
  • このロードバランサーが、実際のサービスの場所を知っており、適切なサービスインスタンスにリクエストをルーティングする
2023-10-05

負荷分散方法の1つであるDSR(Direct Server Return)方式について知ることが出来ました。

DSR方式とは、サーバーからのレスポンスをロードバランサーを経由せず直接クライアントへ返却することで、ロードバランサーの負荷やレイテンシを減少させる負荷分散方法

2023-10-13

自社サービスCにて、Slackに通知を送る際に「SNS + Lambda」ではなく「SNS + Chatbot」を使用している理由について知ることができました。やはり開発工数的な面で「SNS + Chatbot」の方がラクというのが理由でした。またstep functionsにて、並行ステートではなく、mapステートを使っている理由を知ることもできました。こちらに関しても、想像の通りでして、全企業の処理が終了してから次のステートへ移る並行ステートではなく、処理が完了した企業から順にOPEN APIへリクエストを投げることのできるmapステートを使うことで、取り込みの効率化を実現できるというのが理由でした。

2023-10-16

媒体から情報を取得するLambda関数を、dockerを利用して動かすことのメリットについて理解することができました。

  • Lambda関数のコードとその依存関係をdockerイメージとして定義することで、Lambda関数のランタイムや依存関係を包括的に管理でき、より柔軟な運用が可能になる
  • LambdaがDockerイメージをサポートするようになったことで、ECRリポジトリに保存されているイメージを読み込み、そのイメージをもとにコンテナを作成し、そのコンテナ内でLambda関数を実行することができるようになった
  • 従来のLambdaでは、ZIPファイルにコードと依存関係をまとめて、アップロードしていた
2023-10-17

Lambdaレイヤーについて知ることができました。

Lambdaレイヤーとは、Lambda関数のコードとは独立した、共通のコンポーネントやライブラリを管理・共有するための機能。Lambdaレイヤーを使用することで、複数の関数間でコード,ライブラリ,カスタムランタイム,その他の関数依存関係を共有・再利用することができる。

主な特徴や利点

  • コードの再利用:同じライブラリやカスタムランタイムを使用する複数のLambda関数がある場合、それらの共通のコンポーネントをレイヤーとして一元管理することができる。これにより、それぞれの関数のデプロイパッケージが小さくなり、管理が容易になる。
  • バージョン管理:レイヤーはバージョン管理されており、異なるバージョンのレイヤーを異なる関数または関数のバージョンに関連付けることができる
  • 独立した権限:レイヤーにはそれ自体のIAM権限があり、異なるAWSアカウントや組織内のチーム間で共有することができる

Lambdaレイヤーの使用例

  • 共通のユーティリティライブラリやSDKをレイヤーに格納して、複数の関数から利用する
  • データベースの接続情報や設定ファイルをレイヤーに格納して再利用する
2023-10-18

なんとなく下記AWSサービスについて気になったので調べてみました。概要だけですが、知ることが出来ました。

【Fargate】

  • AWSが提供する、ECS(Elastic Container Service)またはEKS(Elastic Kubernetes Service)と互換性のあるサーバーレスのコンピューティングエンジン
  • 開発したアプリケーションのコードをコンテナにパッケージングし、Fargateというコンテナ基盤にデプロイするだけで、アプリケーションの実行環境であるコンテナのスケーリングや管理を自動的に行うことが可能
  • サーバーやクラスターを管理することなく、コンテナを実行することができる

【ElastiCache】

  • AWSが提供するマネージド型のインメモリデータストア及びキャッシュサービス
  • 高速でスケーラブルなインメモリキャッシュを簡単にセットアップ、運用、スケールすることができる
  • ElastiCacheで利用可能なエンジンは、RedisとMemcached
  • データベースの負荷を軽減するためのセッションストアとして、また高速なキャッシュとして利用されることが多い
  • リアルタイムアナリティクス、ゲーミング、モバイルアプリケーション、eコマースサイトなど、多岐にわたるアプリケーションでの使用が考えられる

【CloudTrail】

  • AWSが提供するサービスの監査トレイル記録サービス
  • CloudTrailを使用すると、AWSアカウントで行われるAPI呼び出しの記録、監査、および保存を簡単に行うことができる
  • セキュリティ分析、リソースの変更追跡、コンプライアンス監査など、多岐にわたる用途で利用される
  • AWSアカウントの活動を可視化し、必要に応じて対応を取ることができるため、セキュリティ意識の高い組織や大規模なエンタープライズでの利用が特に一般的
2023-10-19
  • SAMとは、Serverless Application Modelの略で、AWSが提供するサーバーレスアプリケーションの開発を助けるフレームワークのこと
  • AWS SAMは、AWS CloudFormationの拡張であり、サーバーレスリソース(例: AWS Lambda、Amazon API Gatewayなど)の定義と構成を簡略化する
  • SAM CLIとは、SAMを使用してサーバーレスアプリケーションを開発、テスト、デバッグするためのコマンドラインツール
  • 例えば、sam build, sam deploy, sam package などのコマンドが含まれている
  • samconfig.tomlとは、SAM CLIで使用される設定ファイルのこと
  • このファイルは、SAM CLIの各コマンドのデフォルトパラメータや設定を保存するためのもの
  • 例えば、sam deployコマンドを使用してアプリケーションをデプロイする際のデフォルトのスタック名やリージョンなどの情報を保存することができる
  • 主な利点は、再利用可能なデフォルトの設定値を提供することによって、SAM CLIのコマンドの実行を簡単かつ迅速に行うことができる点である。これにより、繰り返し同じパラメータを入力する必要がなくなる
  • AWS SAM(Serverless Application Model)とは、サーバレスアプリケーションの開発とデプロイメントを容易にするためのフレームワーク
  • SAMは、CloudFormationの拡張として、サーバレスリソース(Lambda関数、API Gateway、DynamoDBテーブルなど)をより簡単に定義できる特別なシンタックスを提供している
  • SAM CLIは、SAMテンプレートの構築、ローカルでのテスト、デプロイメントなどを支援するコマンドラインツール(例: ローカルでのLambda関数のテスト、デプロイメントの準備と実行などのタスクをサポートしている)

GitHub Actionsとの連携

  • GitHub Actionsのワークフロー定義ファイルで、aws-actions/setup-sam@v2, sam build, sam deploy が定義されているとのことで、これはコードの変更があった際に自動的にSAMを使ってデプロイメントを行う設定になっている
  • sam build:SAMテンプレートとその関連ファイル(Lambda関数のコードなど)をビルドする。このコマンドは、依存関係のインストールや、特定のランタイム向けのビルドを行う
  • sam deploy:ビルドされたアーティファクトをデプロイするためのコマンド。このコマンドを実行すると、sam packageの動作も内部的に行われる。つまり、Lambda関数のコードや依存関係がS3バケットにアップロードされ、CloudFormationテンプレートはそのS3のURLを指すように自動的に書き換えられる。その後、更新されたテンプレートでCloudFormationスタックがデプロイまたは更新される

sam package はAWS SAM (Serverless Application Model) CLIのコマンドの一つで、以下の主なタスクを実行する

  • アーティファクトのパッケージング:Lambda関数のコード、Lambda Layer、または任意のSAMで定義されているリソースのローカルアーティファクト(例: zipファイルや依存関係など)をS3バケットにアップロードする
  • テンプレートの変換:元のSAMテンプレート内のローカルパス(例えば、Lambda関数のコードへのパス)を、上記でS3にアップロードしたアーティファクトのS3のURLに置き換えます。この変換されたテンプレートは、次のデプロイステップで使用されます。

sam package コマンドは、以下のような形式で実行される

sam package \
–template-file template.yaml \
–output-template-file packaged.yaml \
–s3-bucket my-s3-bucket

–template-file は、元のSAMテンプレートへのパスを指定
–output-template-file は、変換後のテンプレートを保存するためのファイル名を指定
–s3-bucket は、アーティファクトをアップロードするS3バケットの名前を指定
このコマンドが完了すると、packaged.yaml(上記の例では)という名前の新しいCloudFormationテンプレートファイルが生成され、このファイルはデプロイメントに使用される。

最近のSAM CLIのバージョンでは、sam deploy コマンドが sam package の機能を内部的に実行するため、個別に sam package を実行する必要がなくなってきている。しかし、古いワークフローやドキュメントでは sam package のステップが含まれている場合があります。

2023-10-20

taskcatについて理解しました。

  • taskcatとは、AWS CloudFormationテンプレートを複数のリージョンで自動的にテストするためのツール
  • 特にテンプレートが複数のリージョンにデプロイされる予定の場合や、複雑なテンプレートの振る舞いを確認したい場合に役立つ
  • CloudFormationテンプレートの開発やデバッグの際に、テンプレートの問題を早期に検出し、複数のリージョンでの動作を確認するための非常に有用なツール
2023-10-23

pythonで使えるSDKであるboto3(ボトスリー)について理解することができました

・boto3とは、AWSが提供するPython SDKのこと。boto3を使用することで、PythonからAWSのサービスを操作したり、各種リソースを管理することが可能

・boto3の主な特徴や使用例
 ・boto3は、S3やEC2、DynamoDBなど、多くのAWSサービスにアクセスして操作することができる
 ・boto3には、ResourceとClientという2つの異なるサービスインターフェースがある
  ・Resourceはより高レベルのオブジェクト指向的なAPIを提供し、Clientは低レベルのサービス操作への直接的なアクセスを提供する(更なる詳細は下記)
   ・Resourceは、オブジェクト指向プログラミングのパラダイムに従って設計されている。
    これにより、AWSの各リソース(S3バケットやEC2インスタンスなど)をオブジェクトとして扱うことができ、そのオブジェクトのメソッドやプロパティを通じてリソースを操作可能。
    このインターフェースは、直感的で読みやすく、簡単にコードを書くことができるのが特徴
   ・Clientは、AWSの各サービスに対する直接的なAPI呼び出しを提供する。
    これはAWSのサービスが提供するAPIのほぼ1:1のマッピングであり、より詳細な制御や設定が可能。しかし操作が少し複雑になることがある
 ・boto3は、AWS認証情報を使用してAWSサービスへのアクセスを認証する。
  これらの認証情報は、環境変数やAWSの設定ファイル、IAMロールなど、複数の方法で提供することができる
 ・boto3は、APIのページネーション処理や、特定の条件が満たされるまでの待機、エラーレスポンスのハンドリングなど、多くの便利な機能を提供している

・boto3は、Pythonを使用してAWSリソースを操作するための主要なツールとなっており、多くの開発者に利用されている

2023-10-24

from bs4 import BeautifulSoup によりインポートされる Beautiful Soup 4(BS4)ライブラリの BeautifulSoup(ビューティフルスープ)クラスについて理解することができました。

BeautifulSoupとは、HTMLやXMLからのデータ抽出や解析のためのPythonライブラリ。ウェブスクレイピングを容易に行うためのツールとして非常に人気がある。
Beautiful Soupは以下のようなことを可能にする

  • 文書の解析:HTMLやXML文書を解析し、Pythonで操作しやすい形式のデータ構造に変換する
  • 要素の検索:タグ名、属性、CSSセレクタ、正規表現などを使用して、文書内の特定の要素や内容を簡単に検索することが可能
  • 文書の変更:タグの追加、削除、変更など、文書の内容を変更することができる
  • 文書のナビゲーション:文書の階層構造を移動することで、親や子、兄弟要素などを容易にアクセスできる
2023-10-25

Pythonにおいて、from botocore.errorfactory import ClientError によりインポートされる ClientError クラスについて理解することができました。

  • botocore.errorfactory.ClientErrorは、boto3 と botocoreライブラリを使用してAWSサービスにアクセスする際に発生する可能性があるエラーを表すクラスのこと
  • boto3は、PythonでAWSサービスを操作するためのライブラリであり、botocoreはその低レベルなコア部分を提供する
  • ClientErrorは、AWSサービスからのエラーレスポンスを捕捉し、プログラム内で適切に処理するために使用される
  • あるAWSリソース(例:S3バケット)にアクセスしようとしたときに、そのリソースが存在しない場合や認証情報が無効な場合など、何らかの問題が発生した場合に、AWSサービスはエラーレスポンスを返す。このようなエラーレスポンスをClientErrorとして捕捉し、プログラム内で適切に処理することができる

下記に、boto3を使ってS3バケットの内容をリストする際に、ClientErrorを使ってエラーを捕捉する例を示す

import boto3
from botocore.errorfactory import ClientError
s3 = boto3.client(‘s3’)
bucket_name = ‘my-bucket’
try:
response = s3.list_objects_v2(Bucket=bucket_name)
print(response)
except ClientError as e:
# エラーコードやエラーメッセージなどの詳細情報を取得
error_code = e.response[‘Error’][‘Code’] error_message = e.response[‘Error’][‘Message’] print(“An error occurred: {error_code} – {error_message}”)

上記のような形で、ClientErrorを利用することで、AWSサービスとのコミュニケーション中に発生する可能性があるエラーを効果的にハンドルすることが可能

2023-10-26

PHPの下記の関数について知ることができました。

  • exif_imagetype:Exif拡張モジュールの関数で、画像ファイルの最初の数バイトを読み取って、画像の種類を決定する
  • filemtime:指定したファイルの最後の変更時刻を取得する
  • gmdate:GMTでの日時を返す

機会があれば使っていきたいと思います。

2023-10-27

Pythonの reモジュール と glob(グロブ)モジュール について理解しました。

(reモジュール)
Pythonの正規表現モジュールのこと。reモジュールは、文字列に対して正規表現操作を提供する。
具体的な機能

  • 検索(re.search):文字列内に特定のパターンが存在するか検索する
  • 一致確認(re.match):文字列の先頭が特定のパターンと一致するかどうか確認する
  • 置換(re.sub):文字列内の特定のパターンを別の文字列に置き換える
  • 分割(re.split):文字列を特定のパターンを基にして分割する
  • 全ての一致を検索(re.findall):文字列内で特定のパターンに一致するすべての部分文字列を見つける
  • パターンのコンパイル(re.compile):同じ正規表現を繰り返し使用する場合に、そのパターンを事前にコンパイルして使い回すことができる

(globモジュール)

  • globモジュールは、ディレクトリのワイルドカード検索をサポートしており、ファイルのリストを簡単に取得することができる
  • 具体的には、特定のパターンに一致するファイルやディレクトリの名前をリストとして取得する機能が提供されている
2023-10-30

seleniumを使用してブラウザの自動操作を行う際に必要という理由からインポートしている下記のモジュールやクラスについて理解することができました

from selenium.webdriver.support import expected_conditions as EC
→ expected_conditionsモジュールには、ブラウザで特定の条件が成立するまで待機するための関数(例:要素が表示される、要素がクリック可能になるなど)が定義されている

from selenium import webdriver
→ webdriverモジュールは、各種ウェブブラウザ(Chrome、Firefox、Safariなど)を操作するためのドライバーが提供されている

from selenium.webdriver.common.by import By
→ Byクラスには、HTMLの要素を検索するための方法(例:ID、クラス名、タグ名など)が定義されている

from selenium.webdriver.common.keys import Keys
→ Keysクラスは、キーボードのキー(例:ENTER、TAB、ARROW_DOWNなど)をシミュレートするための定数が提供されている

from selenium.webdriver.chrome import service as fs
→ ChromeDriverのサービスを制御するためのモジュール

from selenium.common.exceptions import TimeoutException
→ Seleniumが提供する例外クラス。TimeoutExceptionは指定した時間内に特定の操作が完了しない場合に発生する

from selenium.common.exceptions import WebDriverException
→ Seleniumが提供する例外クラス。WebDriverExceptionはWebDriverの操作中に問題が発生した場合に発生する

from selenium.webdriver.support.wait import WebDriverWait
→ WebDriverWaitは、ブラウザで特定の条件が成立するまで待機するためのクラス

from selenium.webdriver.chrome.options import Options
→ Optionsクラスは、ChromeDriverを起動する際のオプション(例:ヘッドレスモード、ウィンドウサイズ、ユーザーエージェントなど)を設定するためのクラス

上記のインポートを通じて、ウェブブラウザの操作や検証を自動化するために必要な多くのツールや機能にアクセスできるようになる

2023-10-31

CloudFormationの使用範囲について理解することができました。

  • CloudFormationは、インフラストラクチャーのリソースだけでなく、その上で動作するアプリケーションのコードやランタイムの設定に関しても、定義, デプロイすることができる
  • これにより、インフラストラクチャーとアプリケーションコードの定義を一元化し、再利用可能なテンプレートとして管理することができる