KAKEHASHI Tech Blog

カケハシのEngineer Teamによるブログです。

TypeScriptとPythonで直せると地味にうれしいコードと横断検索する方法

すべてのソースコードを読む時間があればよいのですが。

GitHubを横断して確認すると、ソースコードレベルで気になる箇所はよく見つかります。このとき他のコードベースでも起きてないか確認したいところです。ソースコードレベルの細かいレビューをコツコツしていくことは可能ですが、どうしても量が多くなってしまうのとスケールしづらいです。調査のためにも再現性担保のためにもGitHubで検索できると便利でしょう。

この記事ではカケハシ内で実際に見かけた箇所について、サンプルのGitHub検索クエリを共有します。

カケハシではTypeScriptとPythonを活用していることから、この2言語に絞って記載します。

サンプルはおおよそ検索できていることを目指しています

和暦処理の再実装

TypeScript(JavaScript)では標準ライブラリを使いましょう

date.toLocaleDateString("ja-JP-u-ca-japanese", {year:'numeric'})でOK

初年は元年と表示されます。1年にしたいなら置換が必要です。

🔍検索クエリ例

昭和 大正 language:TypeScript

半角全角正規化の再実装/外部ライブラリ利用

正規化が目的なら標準ライブラリを使いましょう

TypeScriptならtext.normalize()
Pythonならunicodedata.normize('NFKC',text)

外部ライブラリはC拡張のバイナリが多く、アプリサイズが増えるほかインストール周りが厄介といった懸念があります。

ただし、あえて全角/半角に寄せる処理なら外部ライブラリが便利でしょう。英数字だけならcodepointで65248(0xFEE0)を足し引きという方法もあります。

🔍検索クエリ例

hankaku

AWS SDK timeoutの設定がされていない

以下の記事の通り、timeoutを設定しましょう

*boto3ならKeep Aliveも検討しましょう。Configに設定します config=Config(tcp_keepalive=True)

🔍検索クエリ例

language:Python boto3.client NOT connect_timeout Python

/from.+'@aws-sdk/ NOT connectionTimeout language:TypeScript AWS Javascript SDK v3前提

コードが抽象化されていると検索できないことも

preflight requestがキャッシュされていない

クライアントから不要なリクエストが飛ばないようにしつつ、飛ぶときはキャッシュしましょう。

API Gateway REST APIを利用しているならアプリではなくAPI Gateway側で対応すること。CloudFront/ALBも同様です

* API GatewayではminCompressionSizeも設定しましょう

🔍検索クエリ例

defaultCorsPreflightOptions NOT maxage language:TypeScript CDKかつAPI Gateway前提

SQSでバッチでメッセージ送信できていない

send_messagesend_message_batchがあり、batchは10件づつ送信できます。エラーハンドリングには注意。

🔍検索クエリ例

sqs send_message for Python用。精度は低め

GlueでのuseS3ListImplementation

Spark Driverの段階で一度に大量のS3ファイルリストを読み込むとメモリが逼迫するので、useS3ListImplementationにより徐々に読み込むことで逼迫を防止します

The Spark driver tries to list all the files in all the directories, constructs an InMemoryFileIndex, and launches one task per file. This in turn results in the Spark driver having to maintain a large amount of state in memory to track all the tasks. It caches the complete list of a large number of files for the in-memory index, resulting in a driver OOM.

*このS3 Lister機能のほか、Pushdown predicate、File grouping、Partition indexも使っていきましょう。

🔍検索クエリ例

NOT useS3ListImplementation create_dynamic_frame language:Python

AWSデプロイ時のOIDC化

AWSシークレットを保持したくないのでOIDC化しましょう

OIDC化するときは公式ドキュメントなどをよく読みましょう。間違えると脆弱性のリスクがあります。

🔍検索クエリ例

AWS_SECRET_ACCESS_KEY path:.github/ language:YAML GitHub Actions利用が前提

強すぎるIAM権限

例えばアプリケーションにS3関係の操作が必要としても、PutBucketPolicyが必要でしょうか? アプリケーションに付与するならコントロールプレーンへの操作権限はほぼ不要でしょう

とにかく*は要注意です

🔍検索クエリ例

action /s3:\*/

S3の例。ざっと見るにはこれでもよいですが精査にはPolicy関係のツールを推奨します。IAM Policyのアンチパターンはたくさんありますね

タイムアウトが設定されていないGitHub Actions

デフォルトのタイムアウトが長く、6時間分の料金が取られる恐れがあります

🔍検索クエリ例

NOT timeout-minutes: path:.github/ language:YAML

setup-*しているのでactions/cache不要なActions

主要なパッケージマネージャーならactions/cacheを使わなくてもcache可能です。

steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'npm'
- run: npm ci
- run: npm test

あえて修正するほどではないです

🔍検索クエリ例

actions/cache actions/setup- NOT /cache:/ path:.github/ language:YAML

さいごに

利用技術を絞り込んでいるほうが明らかに横断検索しやすいです。今回はGitHubの標準機能内に収めましたが、GitHub Advanced SecurityならCodeQLが使えますし、SourceGraphならコードを検知して通知できます。

文責:高木