私の戦闘力は53万です

awsとgcpについて書きます

AWS SAM がgithub actionsを使えるようになったので試してみた

f:id:remmemento:20210703211848p:plainf:id:remmemento:20210703211705p:plain

AWS SAMがgithub actionsを利用できるようになったようなので使ってみました。
使ってみるとめちゃくちゃ良かったので、記事にしてみました。

事前準備

まず何でも良いのでsamを作成します

sam init -r python3.8 -n github-actions-with-aws-sam --app-template "hello-world"

続いて.github/workflows/sam-pipeline.ymlを追加します
※regionとs3バケットを書き換えてください

on:
  push:
    branches:
      - main
jobs:
  build-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
      - uses: aws-actions/setup-sam@v1
      - uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ##region##
      # sam build 
      - run: sam build --use-container

# Run Unit tests- Specify unit tests here 

# sam deploy
      - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --stack-name sam-hello-world --s3-bucket ##s3-bucket## --capabilities CAPABILITY_IAM --region ##region##

credentialの登録

githubのsettings > secretsで下記を登録します。

pushしてみる

上記で準備ができましたのでmainにpushしてみます

git add .
git commit -m "add github actions"
git push origin main

f:id:remmemento:20210703204759p:plain

無事にactionsが完了しました。 APIGatewayが作成されていますので
実行してみるとレスポンスが返ってくることを確認できました。

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

変更してみる

さらに、lambdaを変更し、再度pushすると、
変更が反映されていることが確認できました。

cat hello_world/app.py

import json

# import requests


def lambda_handler(event, context):
  
    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world update",
            # "location": ip.text.replace("\n", "")
        }),
    }
curl -X GET  https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello
{"message": "hello world update"}

テスト(pytest)を実行してみる

pytest利用する場合も試してみました。
簡単にテストを書いてみます

cat tests/unit/test_handler.py
import json
import pytest
from hello_world import app

def test_lambda_handler():

    ret = app.lambda_handler("", "")
    assert ret["statusCode"] == 200

def test_err_lambda_handler():
    ret = app.lambda_handler("", "")
    assert ret["statusCode"] == 400

github actionsでpytest可能なよう設定します

cat requirements.txt
pytest

.github/workflows/sam-pipeline.ymlにテスト部分を追記します

 # sam build 
      - run: sam build --use-container

      # Run Unit tests- Specify unit tests here 
      - run : pip install -r requirements.txt # 追記
      - run: pytest -s -k test_lambda_handler # 追記
      # - run: pytest -s -k test_err_lambda_handler # 追記

pytestが実行されることが確認できました f:id:remmemento:20210703205512p:plain

上記のコメントアウトしていた失敗する方のテストケースも流してみます。 .github/workflows/sam-pipeline.ymlを修正します

 # sam build 
      - run: sam build --use-container

      # Run Unit tests- Specify unit tests here 
      - run : pip install -r requirements.txt # 追記
      - run: pytest -s -k test_lambda_handler # 追記
      - run: pytest -s -k test_err_lambda_handler # 追記

きちんと失敗してくれていることが確認できました f:id:remmemento:20210703205549p:plain

失敗した場合は、後続の処理が行われず
デプロイがされずに止まってくれます。

最後に

個人的には今後samを利用するときは、
この使い方がベースになりそうなほど良かったです。

今回試してみたのの元ネタはこちらです。
細かい箇所はこちらも併せてご参考ください。 aws.amazon.com