以下の挙動を確認するための検証プロジェクト。
- Lambda のカスタムランタイムを使ったシェルスクリプトの実行
- 必要なライブラリのインストール
- aws cli の実行
- 環境変数の設定と参照
- Slack への通知
- シェルスクリプトから外部ファイルの参照
インストール方法は任意。Docker イメージでも構わない。
➜ aws --version
aws-cli/2.4.29 Python/3.9.12 Darwin/19.6.0 source/x86_64 prompt/off
AWS SAM を使ったデプロイが良ければ https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html などを参考に sam
をインストールしておく。
➜ sam --version
SAM CLI, version 1.47.0
IAM の credentials.csv を使用してプロファイルを登録する。 CLI から Lambda へデプロイするために必要。
マネジメントコンソールなどで以下のポリシーを付与したロールを作成する。
- AmazonS3ReadOnlyAccess
- AWSLambdaExecute
以下のファイルを zip に固める。
- bootstrap
- function.sh
- filter.conf
➜ zip function.zip function.sh bootstrap filter.conf
作成した zip ファイルを aws lambda
を使って Lambda にデプロイする。
➜ aws lambda create-function --function-name {関数名} --zip-file fileb://function.zip --handler function.handler --runtime provided --role arn:aws:iam::XXX:role/{ロール名} --profile {プロファイル名}
- {関数名}:任意の名前を付ける
- arn:aws:iam::XXX:role/{ロール名}:事前準備で作成した ARN を指定する
- {プロファイル名}:事前準備で登録したプロファイル名を指定する
以下のファイルを zip に固める。
- bootstrap
- function.sh
- filter.conf
➜ zip function.zip function.sh bootstrap filter.conf
作成した zip ファイルを aws lambda
を使って Lambda にデプロイする。
➜ aws lambda update-function-code --function-name {関数名} --zip-file fileb://function.zip --profile {プロファイル名}
- {関数名}:任意の名前を付ける
- {プロファイル名}:事前準備で登録したプロファイル名を指定する
Lambda に次の環境変数を設定しておき、プログラムから値を参照する。
キー | 用途 |
---|---|
BUCKET | プログラムから参照する S3 のバケット名 |
GREP | S3 からダウンロードしたファイルを grep する正規表現 |
SLACK_WEBHOOK_URL | 実行結果を通知する Slack の Webhook URL |
これらの環境変数は environment.conf に定義する。 environment.conf は environment.conf.sample をコピーして作成する。
➜ cp environment.conf.sample environment.conf
➜ cat environment.conf
GREP="value1"
BUCKET="value2"
SLACK_WEBHOOK_URL="value3"
➜ vim environment.conf #=> エディタで environment.conf の value1, value2 などを適切な内容に更新する
環境変数を aws lambda
を使って Lambda に反映する。
➜ aws lambda update-function-configuration --function-name {関数名} --environment Variables={`cat environment.conf | tr -s "\n" | tr '\n' ','`} --profile {プロファイル名}
- {関数名}:任意の名前を付ける
- {プロファイル名}:事前準備で登録したプロファイル名を指定する
Variables は Variables='{GREP="value1",BUCKET="value2"}'
の形式で指定する。
シングルクォートで全体を囲み、それぞれの値はダブルクォートで囲むこと。
ただし、少々面倒なので、以下のコマンドにより environment.conf を読み込んで指定の形式に分解できる。
{`cat environment.conf | tr -s "\n" | tr '\n' ','`}
WAF を通過した URI をリストする。
通過した URI はアプリケーション的に正しい URI が多いため、grep -v
で除外する。
この除外する URI は filter.conf に定義する。
filter.conf は filter.conf.sample をコピーして作成する。
➜ cp filter.conf.sample filter.conf
➜ cat filter.conf
uri1
uri2
uri3
➜ vim filter.conf #=> エディタで filter.conf の uri1, uri2 などを適切な内容に更新する
以下のファイルは CLI だろうと SAM でも必要なファイル。SAM 用に更新する、といった作業も不要。
- bootstrap
- filter.conf
- function.sh
以下は SAM 版では不要になる。別のファイルに置き換わる、もしくは SAM が処理してくれる。
- environment.conf → template.yaml に定義するため不要
- function.zip →
sam
が自動的に zip を作成し、AWS に送信するため不要
以下は SAM 版では必須になる。
- Makefile
- samconfig.toml
- template.yaml
ビルドの実行手順を Makefile として作成する。
このプログラムでは bootstrap, filter.conf, function.sh のファイルが必要になるため、それらを ARTIFACTS_DIR
にコピーするだけになる。
ちなみに、このプロジェクトの場合 ARTIFACTS_DIR
は .aws-sam/build/BashCustomRuntimeFunction
になる。
SAM の設定を定義する。
samconfig.toml は samconfig.toml.sample をコピーして作成する。 "# TBD" の部分を適宜更新すること。
➜ cp samconfig.toml.sample samconfig.toml
➜ vim samconfig.toml #=> エディタで samconfig.toml の TBD を適切な内容に更新する
デプロイする各 AWS サービスの設定を定義する。
template.yaml は template.yaml.sample をコピーして作成する。
"# TBD" の部分を適宜更新すること。
EventBridge によって毎日 9:30 に定期実行する設定となっている点に注意すること。
➜ cp template.yaml.sample template.yaml
➜ vim template.yaml #=> エディタで template.yaml の TBD を適切な内容に更新する
プロジェクト直下で sam build
を実行する。
➜ sam build
プロジェクト直下で sam deploy
を実行する。
➜ sam deploy --profile {プロファイル名}
- {プロファイル名}:事前準備で登録したプロファイル名を指定する
ローカル環境で実行するための Dockerfile を用意した。 前提条件は以下の通り。
- シェルスクリプトの動作確認を目的とした Dockerfile とする
- 動作確認できる最低限のライブラリをインストールする
- 動作確認に必要なファイルは、あらかじめ work ディレクトリに置いておく
- この前提のため、aws cli はインストールしない
例として lambda_custom_runtime_bash をリポジトリ名とする場合は以下のコマンドを実行する。
➜ docker image build -t lambda_custom_runtime_bash .
Dockerfile に定義してあるが work/sandbox.sh が存在する場合は、コンテナ実行時にスクリプトが実行される。
➜ docker run -it --rm lambda_custom_runtime_bash
## => 実行結果が出力される
コンテナにログインする場合は以下を実行する。
➜ docker run -it --rm lambda_custom_runtime_bash /bin/bash
# コンテナの中で何かする
bash-5.1$ ls
filter.conf work