AWS

AWS SAMのdeleteコマンドを試す

こんにちはエンジニアの sakasai です。

YouTubeで配信されているフジロックをずっと垂れ流してます。

さて、みんな大好きAWS Serverless Application Model(SAM)にdeleteコマンドが追加されました。

https://github.com/aws/aws-sam-cli/releases/tag/v1.29.0

※2021-8-21時点ではまだドキュメントには記載されていないようでした。

さっそく試してみようと思います。


AWS SAMとは

AWSがオープンソースで開発しているサーバーレスアプリケーション構築用のフレームワークです。

https://aws.amazon.com/jp/serverless/sam/

SAM CLI を使うことによりローカル環境で開発(ビルド、ローカル実行)、AWS環境へのデプロイなどを行うことが出来、サーバーレスアプリケーションを高速に構築することが出来ます。

AWSリソース(Lambda関数など)の定義はyamlファイルで行い ※1、デプロイを行うとCloudFormationでリソースが作成されます。

※1 CDKでもできるようになったようです(プレビュー)


deleteコマンドを試す

deleteするためにまずはアプリケーションを構築してデプロイします。

今回はSAM CLIでサンプルで構築できるアプリケーションをそのまま使いました。

バージョン

deleteコマンドが追加された以下のバージョンで実行します。

bash-3.2$ sam --version
SAM CLI, version 1.29.0

helpを見るとdeleteが追加されています。

bash-3.2$ sam --help
Usage: sam [OPTIONS] COMMAND [ARGS]...

  AWS Serverless Application Model (SAM) CLI

  The AWS Serverless Application Model extends AWS CloudFormation to provide
  a simplified way of defining the Amazon API Gateway APIs, AWS Lambda
  functions, and Amazon DynamoDB tables needed by your serverless
  application. You can find more in-depth guide about the SAM specification
  here: https://github.com/awslabs/serverless-application-model.

Options:
  --debug     Turn on debug logging to print debug message generated by SAM
              CLI and display timestamps.

  --version   Show the version and exit.
  --info
  -h, --help  Show this message and exit.

Commands:
  init      Init an AWS SAM application.
  validate  Validate an AWS SAM template.
  build     Build your Lambda function code
  local     Run your Serverless application locally for quick development &...
  package   Package an AWS SAM application.
  deploy    Deploy an AWS SAM application.
  delete    Delete an AWS SAM application and the artifacts created by sam
            deploy.

  logs      Fetch logs for a function
  publish   Publish a packaged AWS SAM template to the AWS Serverless
            Application Repository.

  pipeline  Manage the continuous delivery of the application

deleteコマンドのオプションも確認してみます。

bash-3.2$ sam delete --help
Usage: sam delete [OPTIONS]

  The sam delete command deletes the CloudFormation stack and all the
  artifacts which were created using sam deploy.

  e.g. sam delete



Options:
  --stack-name TEXT   The name of the AWS CloudFormation stack you want to
                      delete.

  --config-file TEXT  The path and file name of the configuration file
                      containing default parameter values to use. Its default
                      value is 'samconfig.toml' in project directory. For more
                      information about configuration files, see:
                      https://docs.aws.amazon.com/serverless-application-
                      model/latest/developerguide/serverless-sam-cli-
                      config.html.  [default: samconfig.toml]

  --config-env TEXT   The environment name specifying the default parameter
                      values in the configuration file to use. Its default
                      value is 'default'. For more information about
                      configuration files, see:
                      https://docs.aws.amazon.com/serverless-application-
                      model/latest/developerguide/serverless-sam-cli-
                      config.html.  [default: default]

  --no-prompts        Specify this flag to allow SAM CLI to skip through the
                      guided prompts.

  --profile TEXT      Select a specific profile from your credential file to
                      get AWS credentials.

  --region TEXT       Set the AWS Region of the service (e.g. us-east-1).
  --debug             Turn on debug logging to print debug message generated
                      by SAM CLI and display timestamps.

  -h, --help          Show this message and exit.

アプリケーションの作成

initコマンドで構築します。

bash-3.2$ sam init
Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1
What package type would you like to use?
        1 - Zip (artifact is a zip uploaded to S3)
        2 - Image (artifact is an image uploaded to an ECR image repository)
Package type: 1

Which runtime would you like to use?
        1 - nodejs14.x
        2 - python3.9
        3 - ruby2.7
        4 - go1.x
        5 - java11
        6 - dotnetcore3.1
        7 - nodejs12.x
        8 - nodejs10.x
        9 - python3.8
        10 - python3.7
        11 - python3.6
        12 - python2.7
        13 - ruby2.5
        14 - java8.al2
        15 - java8
        16 - dotnetcore2.1
Runtime: 2

Project name [sam-app]: sam-delete-app

Cloning from https://github.com/aws/aws-sam-cli-app-templates

AWS quick start application templates:
        1 - Hello World Example
        2 - EventBridge Hello World
        3 - EventBridge App from scratch (100+ Event Schemas)
        4 - Step Functions Sample App (Stock Trader)
        5 - Elastic File System Sample App
Template selection: 1

    -----------------------
    Generating application:
    -----------------------
    Name: sam-delete-app
    Runtime: python3.9
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    
    Next steps can be found in the README file at ./sam-delete-app/README.md

アプリケーション名をsam-delete-app、ランタイムをpython3.9にして、Hello World Exampleのテンプレートで作成しました。

アプリケーションの一部を変更してみます。

# sam-delete-app/hello_world/app.py

...(省略)
    print('Hello, Delete App.')

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello delete world",
            # "location": ip.text.replace("\n", "")
        }),
    }
...(省略)

"'Hello, Delete App.'"のprint文を追加し、レスポンスのmessageを"hello delete world"にします。

ビルドして、ローカル環境で実行してみます。

ビルド

bash-3.2$ sam build --use-container
Starting Build inside a container
...(省略)

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided
    
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource

ローカル実行

bash-3.2$ sam local invoke
Invoking app.lambda_handler (python3.9)
Skip pulling image and use local one: public.ecr.aws/sam/emulation-python3.9:rapid-1.29.0.

...(省略)

START RequestId: 842d237e-9135-4c94-8b2e-04249b73a9c4 Version: $LATEST
Hello, Delete App.
END RequestId: 842d237e-9135-4c94-8b2e-04249b73a9c4
REPORT RequestId: 842d237e-9135-4c94-8b2e-04249b73a9c4  Init Duration: 1.15 ms  Duration: 510.01 ms     Billed Duration: 600 ms Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello delete world\"}"}

print文が出力されていることと、レスポンスのmessageが確認できました。

デプロイ

ローカルでの確認ができたのでAWS環境にデプロイします。

bash-3.2$ sam deploy --guided

Configuring SAM deploy
======================

...(省略)

        Deploying with following values
        ===============================
        Stack name                   : sam-delete-app
        Region                       : ap-northeast-1
        Confirm changeset            : True
        Deployment s3 bucket         : aws-sam-cli-managed-default-samclisourcebucket-1u6sf62cgex0g
        Capabilities                 : ["CAPABILITY_IAM"]
        Parameter overrides          : {}
        Signing Profiles             : {}

...(省略)


Changeset created successfully. 

...(省略)

Successfully created/updated stack - sam-delete-app in ap-northeast-1

AWSリソースが新規追加されて、デプロイが正常終了しました。

マネージメントコンソール上でもCloudFormationスタックが追加されていることを確認できます。

デプロイされたAPI Gatewayのエンドポイントにアクセスすると正常にレスポンスが返ってくることが確認できました。

deleteコマンドの実行

それでは今回のメインイベント、deleteコマンドの実行です。

bash-3.2$ sam delete
        Are you sure you want to delete the stack sam-delete-app in the region ap-northeast-1 ? [y/N]: y
        Are you sure you want to delete the folder sam-delete-app in S3 which contains the artifacts? [y/N]: y
        - Deleting S3 object with key sam-delete-app/365fa63208501ce39bac43c73f594399
        - Deleting S3 object with key sam-delete-app/5df97803a6e24d8f9a601f3c9c383ab2.template
        - Deleting Cloudformation stack sam-delete-app

スタックの削除とS3上のファイルの削除をしてよいか聞かれるので「y」で答えると削除が実行されます。

デプロイした全てのリソースが削除されていることが確認できました。

※Lambdaのログ(CloudWatch Logsのロググループは残ってしまうようなので必要に応じて削除してください)


まとめ

今までCloudFormationのスタックから削除を実行していたのですが、deleteコマンドで削除ができるようになったことで簡単に削除ができるようになりました。

よかったよかった


Recruit

ディーメイクでは各ポジションで一緒に働く仲間を募集中! エンジニア、デザイナー、ディレクターなど、多彩な職種があります。
一緒に成長していきましょう!

最新記事

おすすめ記事リンク

-AWS
-,