「AKIBA.AWS ONLINE 7」にて説明に使用したサンプルコードです。
- AWSアカウント
AdministratorAccess
など、デプロイに必要な権限を割り当ててください
- AWS CLI v2
- node.js v14.x 以上
- python v3.8
- Docker
sls deploy
時にPythonパッケージビルドにDockerコンテナ使用してます- これは
serverless-python-requirements
プラグインでdockerizePip: true
を指定しているためです
yarn install
最初に「AWS Data Wrangler」を Lambda Layerにデプロイしておきます。
-
Releaseページから、 Lambda Layer向けリリースパッケージをダウンロード
- 今回のプロジェクトでLambdaはPython 3.8を使用するので、
layer-<wranglerバージョン>-py3.8.zip
をダウンロードする
- 今回のプロジェクトでLambdaはPython 3.8を使用するので、
-
任意の名前のS3バケットをあらかじめ作成しておく
- マネジメントコンソールまたはAWS CLIで作成してください
- 例では
awswrangler-sample-lambdalayer
というバケット名を作成します。
-
作成したS3バケットに、Lambda Layer向けData Wranglerパッケージをアップロード
-
/cfn
にあるCloudFormationテンプレートをデプロイawswrangler_layer.yml
内にあるContentUri
のS3 URIを適宜変更してください。
aws cloudformation deploy \
--template-file ./cfn/awswrangler_layer.yml \
--stack-name awswrangler-layer-deploy-stack \
--capabilities CAPABILITY_IAM
- 作成したLambda LayerのARNを
serverless.yml
に書き換えてください。
wrangle:
handler: functions/wrangle/index.handler
role: AthenaLambdaRole
memorySize: 512
timeout: 900
environment: ${self:custom.environment.${self:provider.stage}}
layers:
- "arn:aws:lambda:ap-northeast-1:000000000000:layer:awswrangler-layer-2_12_1-py3_8:1" ## ここのARNを書き換える
events:
- httpApi:
path: /wrangle
method: get
serverless.yml
の冒頭のサービス名を適宜変更するawswrangler-sample
の部分はS3バケット名にも使っているので、適宜変更してS3バケットを一意の名前になるようにする
service: awswrangler-sample
- Serverless Frameworkのデプロイをする
npx sls deploy
(AWSプロファイルを指定する場合):
npx sls deploy --aws-profile <プロファイル名>
デプロイが完了すると、エンドポイントが生成される。
endpoints:
GET - https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/hello
GET - https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/wrangle
サンプルデータを作成し、
デプロイで作成された DataLakeBucket
にアップロードする。
(サービス名が awswrangler-sample
の場合は、バケット名は awswrangler-sample-datalake-bucket-dev
になる)
まず必要なPythonライブラリをPython仮想環境上にインストールする
cd data
python3 -m venv env
source env/bin/activate
pip install -U pip
pip install -r requirements.txt
/data
にあるPythonファイルを実行する。
引数にバケット名を指定する。
python create_parquet_data.py "awswrangler-sample-datalake-bucket-dev"
(AWSプロファイルを指定する場合):
AWS_PROFILE=<プロファイル名> python create_parquet_data.py "awswrangler-sample-datalake-bucket-dev"
データ生成後は、仮想環境を終了してプロジェクトトップディレクトリに移動する。
deactivate
cd ..
デプロイ時に表示された API Gateway の URL を CURL で実行
## Data Wrangler不使用
curl "https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/hello"
## Data Wrangler使用
curl "https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/wrangle"
DataLakeBucket
及びAthenaResultBucket
を空にする
aws s3 rm s3://awswrangler-sample-datalake-bucket-dev --recursive
aws s3 rm s3://awswrangler-sample-athena-result-bucket-dev --recursive
- Serverless Frameworkでデプロイしたプロジェクトを削除
npx sls remove
(AWSプロファイルを指定する場合):
npx sls remove --aws-profile <プロファイル名>
なお、AthenaのWorkGroupが削除できない場合は、
以下のコマンドを実行してAthena WorkGroupを削除、及び
AthenaResultBucket
を空にしてから、再度 npx sls remove
を実行すると良い。
(Athenaワークグループ名は <Serverless Framework サービス名>-athena-workgroup-dev
になる)
aws s3 rm s3://awswrangler-sample-athena-result-bucket-dev --recursive
aws athena delete-work-group --work-group awswrangler-sample-athena-workgroup-dev --recursive-delete-option
npx sls remove
これでもダメなら、マネジメントコンソールから残っているリソースを手動削除して、 CloudFormationのデプロイスタックを削除する。
- Lambda Layerのスタックを削除
aws cloudformation delete-stack \
--stack-name awswrangler-layer-deploy-stack
- Data Wranglerパッケージ削除 & Lambda Layer用バケット削除
aws s3 rm s3://awswrangler-sample-lambdalayer --recursive
aws s3 rb s3://awswrangler-sample-lambdalayer