はじめに
あるプロジェクトで初めてLambdaの開発を行った。
Eclipseで開発していたが、AWSと連携するわけでもなく、ローカルでの修正のたびに、AWSにログインして手動で上書きするという流れでやっていた。(非常に非効率的)
CodeStarを活用することで上記が解消されるらしいので試してみる。
本資料は大まかに以下を行っています
- CodeStarでのプロジェクトの作成とローカルでの開発準備
- コードを編集し、アプリケーションの自動ビルド、自動デプロイを実行
- ユニットテストを追加して、自動テストを実行
前提
ルートユーザ、「AWSCodeStarFullAccess」管理ポリシーを持つユーザで実施してください。
プロジェクトの作成
作成されたリソースの確認
AWS lambdaプロジェクト作成により、以下のようにAWSリソースが生成される。各サービス画面から確認する。
ローカルツールに接続
Eclipseにつなげて、CodeCommitで管理されているソースをCloneしてみる。
ローカルツールでコードを編集してみる
-
新規lambda関数の追加
Cloneしたプロジェクトに適当に新規ファイル(hello.py)を追加する。追加したファイルの中身は「参考」のチュートリアルを参考にしてほしい。
-
template.ymlの編集
Resourcesの子要素として以下を追加
Hello:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub 'awscodestar-${ProjectId}-lambda-Hello'
Handler: hello.handler
Runtime: python3.7
Role:
Fn::GetAtt:
- LambdaExecutionRole
- Arn
Events:
GetEvent:
Type: Api
Properties:
Path: /hello/{name}
Method: get
-
コミット結果の確認
ユニットテストを追加し、自動テストしてみる
- ローカルツールにCloneしたプロジェクトにhello_test.pyを追加する。内容は以下の通り。
GET /hello/{name} を実行し、そのレスポンスが期待値通りかを確認する。
from hello import handler
def test_hello_handler():
event = {
'pathParameters': {
'name': 'testname'
}
}
context = {}
expected = {
'body': '{"output": "Hello testname"}',
'headers': {
'Content-Type': 'application/json'
},
'statusCode': 200
}
assert handler(event, context) == expected
- CodeBuildのビルド仕様を記載しているbuildspec.ymlを変更する。変更部分は日本語でコメントしている
version: 0.2
phases:
install:
runtime-versions:
python: 3.8
commands:
# (追加)ユニットテストツールのインストール
- pip install pytest
# Upgrade AWS CLI to the latest version
- pip install --upgrade awscli
pre_build:
commands:
# (追加)pytestの実行
- pytest
# Discover and run unit tests in the 'tests' directory. For more information, see <https://docs.python.org/3/library/unittest.html#test-discovery>
- python -m unittest discover tests
build:
commands:
# Use AWS SAM to package the application by using AWS CloudFormation
- aws cloudformation package --template template.yml --s3-bucket $S3_BUCKET --output-template template-export.yml
# Do not remove this statement. This command is required for AWS CodeStar projects.
# Update the AWS Partition, AWS Region, account ID and project ID in the project ARN on template-configuration.json file so AWS CloudFormation can tag project resources.
- sed -i.bak 's/\$PARTITION\$/'${PARTITION}'/g;s/\$AWS_REGION\$/'${AWS_REGION}'/g;s/\$ACCOUNT_ID\$/'${ACCOUNT_ID}'/g;s/\$PROJECT_ID\$/'${PROJECT_ID}'/g' template-configuration.json
artifacts:
files:
- template-export.yml
- template-configuration.json
-
上記変更をpushする
-
コミット結果の確認
終わりに
CodeStarを使用することで、Eclipseなどのローカルツールと連携してサーバレスアプリケーションを非常に簡単に素早く構築することができた。
不満なのは、CodeStarで選択できるリポジトリがCodeCommitかGithubしかないこと。(Gitlabでできたらな)
参考