この記事について
最近Lambdaの関数を作成する機会がありました。
その際に、DockerとVScodeを使用してそれっぽい感じの開発環境作ってみました。
その環境の作り方をこの記事にまとめます。
前提
- 端末
- macbook pro (mojave)
- VSCodeインストール済み
- Dockerインストール済み
- AWS CLIを実行するためのクレデンシャルが取得可能(権限は割愛しますが、Administrator Accessを持っていたら楽だと思います)
※DockerとVSCodeはバージョンが古すぎなければ大丈夫だと思います
VSCode + Docker + Pythonの環境を作る
VSCodeにremote-containerの拡張機能を入れる
拡張機能名ms-vscode-remote.remote-containers
コンテナを立ち上げる
作業ディレクトリを作成します。
> mkdir work-lambda
> cd work-lambda
Dockerfileを作成します。
> vi Dockerfile
> cat Dockerfile
FROM python:3.8
RUN pip install pylint
VSCodeで作業ディレクトリを開いて、Remote-Cotainers: Reopen in Container
を実行します。
コンテナが作成され、コンテナの中に入ることが可能になります。(数分間待つ必要あり)
※以下をクリックすると、コンテナをビルドする際のログを確認することができます。
コンテナ上でVSCodeの拡張機能を使用できるようにする
.devcontainer/devcontainer.json
の以下箇所に、使用したい拡張機能を登録します。
Remote-Containers: Rebuild Container
を実行して、コンテナをビルドし直します。
pythonプログラムを実行できるか確認するため、hello.pyファイルを作成します。
print("hello world!")
Pythonプログラムが実行できていることを確認します。
> python hello.py
hello world!
コンテナ上でLambda開発をできるようにする
Chaliceについて
Chaliceというツール(フレームワーク)を使って、lambda開発環境を作ります。
コンテナにChaliceを入れる
Dockerfileを以下の通り更新します。
FROM python:3.8
RUN pip install pylint chalice
Remote-Containers: Rebuild Container
でコンテナをビルドし直します。
lambdaファンクションをデプロイする
chaliceを実行するために、コンテナにクレデンシャル情報を登録します。
以下の操作をコンテナ上にて実施します。
> export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXXX
> export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
デフォルトリージョンを定義します。
> export AWS_DEFAULT_REGION=ap-northeast-1
プロジェクトを作成します。
> chalice new-project helloworld
app.pyの中身を確認します。
(デフォルトでは{'hello': 'world'}を返すだけの関数)
from chalice import Chalice
app = Chalice(app_name='helloworld')
@app.route('/')
def index():
return {'hello': 'world'}
デプロイします。
> cd helloworld/
> chalice deploy
以下の出力が表示されていたらデプロイ完了です。
Resources deployed:
- Lambda ARN: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:helloworld-dev
- Rest API URL: https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/
マネコンからlambda関数が作成されていることを確認します。
一緒に作成されたAPI Gatewayのエンドポイントを叩いてみます。
curl https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/
{"hello":"world"}
ちゃんと動いてそうですね!
削除方法
lambda関数を削除したい場合は、削除したい関数のプロジェクトにて以下を実行します。
> chalice delete