AWS SAM CLIによるサーバレス環境構築


はじめに

前回(エキサイトの開発現場でAWSサーバレス導入事例)を紹介しました。今回は、SAM CLIで構築手順を紹介したいと思います。

前提

今回はOSX環境で直接にコマンドを叩いて試しますが、次回はDocker化します。

まず、Pythonがインストールされている確認

$ python --version
Python 3.8.3

Python 3.8.3が入った

準備

AWS SAM CLIインストール

以下のコマンドでインストールします

$ pip3 install aws-sam-cli

sam cliが入っていること確認

$ sam --version
SAM CLI, version 1.7.0

SAM CLIがインストールされました。

AWS認証の準備

  • AMIユーザーを作成
    AWSの公式ドキュメントのようにIAMユーザー作成を実施、アクセスキーIDとシークレットアクセスキーをメモしておいてください。

  • AMIユーザーに必要なポリシー追加
    ポリシー管理まわり複雑化したくないので、全てFullAccess権限をアタッチします。

No. ポリシー名
1 IAMFullAccess
2 AmazonS3FullAccess
3 AWSLambdaFullAccess
4 AWSCloudFormationFullAccess
5 AmazonAPIGatewayAdministrator

厳密に制限したい場合は、SAMの公式ドキュメントをご参考ください。

  • AWSプロファイル登録
$ aws configure --profile sam-deploy
以下の情報入力
<アクセスキー ID>
<シークレットアクセスキー>
ap-northeast-1
json

複数のサービス運用の方は、--profileオプションを付けてください。

  • リリースステージ用のS3バケット作成
    AWSコンソールにログイン、S3バケット(例:excite-api-lambda-deploy-bucket)を作成します。 Infrastructure as Codeによるインフラ構築の自動化を実現したい場合は、別のプロジェクトでCloudformationもしくはTerraformでS3バケット作成の手段もあります。

構築

アプリケーションのひな形生成

$ sam init \
    --runtime python3.8 \
    --name excite-lambda-deploy\
    --app-template hello-world

excite-lambda-deployプロジェクトが作成されました。

自動生成されたプロジェクト構成が以下のようになります。

excite-lambda-deploy
├── README.md
├── __init__.py
├── events
│   └── event.json
├── hello_world
│   ├── __init__.py
│   ├── app.py
│   └── requirements.txt
├── template.yaml
└── tests
    ├── __init__.py
    └── unit
        ├── __init__.py
        └── test_handler.py

4 directories, 10 files

SAMビルド

$ sam build

実行すると、.aws-sam/ 以下にいろいろと作成されています。

AWSへデプロイ

$ sam deploy \
   --profile sam-deploy \
    --template-file template.yaml \
    --stack-name excite-api-lambda-deploy-stack \
    --s3-bucket excite-api-lambda-deploy-bucket \
    --capabilities CAPABILITY_NAMED_IAM \
    --no-fail-on-empty-changeset

特にエラーがでなければ、これでデプロイが完了しました。

API Gatewayのアクセスポイントでアクセスしてみる(APIエンドポイントはAWSコンソール上に確認できます)

$ curl https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
{"message": "hello world"}

と返ってくれば成功です。

作成したリソース削除

$ aws cloudformation delete-stack  \
   --profile sam-deploy \
   --stack-name excite-api-lambda-deploy-stack

作成されたリソースがすべて削除されます(CloudFormation用のS3バケットはSAMの管理用なので残ります)

最後に

SAMで作れないAWSリソース(IAM、S3、EC2など)はCloudfrontテンプレートもしくはTerraformで構築が必要です。個人的にこちらはサーバーレスアプリケーション用のプロジェクトで、別途でインフラ構築用のプロジェクトを用意した方が良いと思います。

今回は直接にMacOSにインストールしていますが、次のDocker編は実際の開発現場に近い環境構築を紹介したいと思います。