すべてのソースコードを読む時間があればよいのですが。
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_message
とsend_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ならコードを検知して通知できます。
文責:高木