LoginSignup
1

More than 3 years have passed since last update.

全Lambdaからコードをzipダウンロードしてきて、zipのままキーワード検索する

Last updated at Posted at 2020-10-20

これはなに?

全Lambdaからコードをzipダウンロードしてきて、zipのまま検索しました。

  • ① 全Lambdaからコードをダウンロード
  • ② zipのまま検索(zipgrep使用)

の2つの手順で行います。

利用ケース

リポジトリ管理していない直書Lambdaなどが大量に存在するカオスな検証アカウントで特定キーワードを含むLambdaがないか調査するときに使用。
カオスなアカウントが出来上がらないようにするのがいいとは思うのですが、古の闇に手を突っ込む機会に恵まれました。

追記:パッケージングしている外部ライブラリ(リポジトリ上では依存関係のみを定義)の中身も含めて検索したい場合にも有用でした。

① 全Lambdaからコードをダウンロード

nemani/download_all_lambda_functions.sh
https://gist.github.com/nemani/defdde356b6678352bcd4af69b7fe529

これを使います。

前提条件

・wgetが必要
cliのアウトプットをtextにしておく
・bashつかわないとだめかも
・中でaws clilつかっているのでプロファイルなどは設定しておく

使用中

・実行すると "Completed Downloading all the Lamdba Functions!" と表示されるが、バックグラウンドでタスクは続行しており完了はしていない。
・数秒またないとダウンロードが始まらないので待つ
・全てのバックグラウンドタスク終わったという合図がないので、私はダウンロードタスクが止まってzipの数が関数の数と一致したら完了と見做しました。

使用例

# この辺はデフォルトプロファイルなど常に設定しているなら不要
export AWS_DEFAULT_PROFILE=xxxxx
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_DEFAULT_OUTPUT=text
# 実行
bash download_all_lambda_functions.sh 

出力結果

lambda_functions/* に関数ごとにzipが保存される

全リージョンに対して行う場合

全リージョンぐるぐる回すバージョンを書いてみました

download_code () {
    local OUTPUT=$1
    local REGION=$2
    aws lambda get-function --function-name $OUTPUT --query 'Code.Location' --region $REGION | xargs wget -O ./lambda_functions/$OUTPUT-$REGION.zip  
}

mkdir -p lambda_functions

for region in `aws ec2 describe-regions --query 'Regions[].RegionName' --region us-west-1 --output text`
do
    echo $region
    for run in $(aws lambda list-functions --region $region | cut -f 6 | xargs);
    do
        download_code "$run" "$region" &
    done

    echo "Completed Downloading all the Lamdba Functions! $region"
done

echo "finished"

lambda_functions/ 配下に「lambda_functions/{関数名}-{リージョン名}.zip」でダウンロードします。

② zipのまま検索(zipgrep使用)

使用例(HOGEHOGEを検索)

cd lambda_functions

for file in *.zip; do
    res=`zipgrep -n HOGEHOGE $file`
    if [ -n "$res" ]; then
        echo "x:$file";
        echo "$res";
    else
        echo "o:$file";
    fi
done

ボツ

最初は

find ./lambda_functions -name '*.zip' | xargs -I file zipgrep HOGEHOGE file

とかでやってたんですが、これだと、どのzipで検出したかわからなかったので前述のを流して確認しています。

出力結果例

キーワードに引っかかったlambdaを x:〜
引っかからなかったlambdaを o:〜
で出力しています。

x:aaaa-checker.zip
lambda_function.py:30:        target     = "HOGEHOGE",
o:bbbb-deleter.zip
o:cccc-notifier.zip
x:dddd-test.zip
lambda_function.py:21:       print("HOGEHOGE")",
...

備考

Lambda にライブラリや.env環境が同梱されているとgrepはけっこう時間がかかる。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1