🎼

AWS Application Composerを試してみた所感

2022/12/05に公開

re:Invent 2022が終わり、日本に無事帰国しましたが、疲労が完全回復していない人です。



12/2 Werner Vogels氏のKeynoteで発表された AWS Application Composer、早速ですが試してみました。
現状はPublic Preview なので、GAするまでにアップデートがあると思いますが、とりあえず現段階で試してみて、その感想です。

Demoをやってみる

AWS Application ComposerのコンソールにでOpen Demoをクリックして、Demo画面を起動します。

ダイアログが出てきます。
PC上のローカルディレクトリを指定することで、コンソールでの変更が、同期されます。


Createボタンを押すと、
色々ポップアップ出てくるので、この辺OKにします。Mac&Chromeだけかな?

なお、ローカル同期に対応していないFirefoxだと、こうなります。

Demoだとこんな感じのAmazon API Gateway - AWS Lambda -> Amazon DyanmoDB のアプリケーションになります。

Lambdaのところをクリックすると、こんな感じの設定画面が出てきます。

API Gatewayはこんな感じです。

同期設定すると、ローカルにファイルが生成されています。

さて、このファイル群をどうするかですが、
答えは生成されたREADME.mdに書いてあります。

ということで、AWS SAMでbuildしてdeployしてみます。
完了したら、API Endpointができているはずなので、API Gatewayのコンソールで確認します。
(deploy終了時にOutputで出てきてくれるといいですね。FeedBackしますかね。※テンプレート直せよ説あり)

あとは、README.mdに書いてあるように、POSTリクエストを送って、データを登録して、GETしてみます。

wada4:demo wada$ curl -d '{"type": "Car", "color": "Blue"}' https://vbox2cdt2a.execute-api.us-east-1.amazonaws.com/Prod/items
wada4:demo wada$ curl -d '{"type": "Animal", "name": "Giraffe"}' https://vbox2cdt2a.execute-api.us-east-1.amazonaws.com/Prod/items
wada4:demo wada$ curl -d '{"type": "Product", "name": "AWS Application Composer", "favorite": true}' https://vbox2cdt2a.execute-api.us-east-1.amazonaws.com/Prod/items
wada4:demo wada$ curl https://vbox2cdt2a.execute-api.us-east-1.amazonaws.com/Prod/items
{"ids":[{"S":"8ad3751a-3aaa-42a8-a7fa-e2a67102bba4"},{"S":"5606ab7e-6943-4dc7-8507-d2dd9e1409a8"},{"S":"2fd5a68c-0729-47ae-82f3-4510e6190372"}]}

DynamoDBのテーブルを見ると、Postされたデータが登録されているのがわかります。

一通り、Demoで作ったアプリケーションの動作確認まで終わりました。

Blogの内容で作ってみる

次は、リリース時のBlogに沿ってやってみます。
https://aws.amazon.com/jp/blogs/compute/visualize-and-create-your-serverless-workloads-with-aws-application-composer/

最初の方は、基本一緒で、Localと同期するかどうかの選択になります。
「New blank project」を選んだ場合は、template.yamlが存在しないディレクトリを選ばないとエラーになりますので、ご注意ください。

なお、「Load existing project」を選んで、以前同期したディレクトリを選択して、そこにあるtemplate.yamlを選ぶと復元できます。

Blogに沿って、リソースを配置してみましょう。

最終形はこんな感じになります。

Lambda関数用のコードは生成してくれますが、中身はほぼ空の関数でした。
流石にDemoと違い作ってくれないので、実装が必要ですね。
なお、LambdaのSource pathを途中で変更すると、変更前のSource pathがそのまま残るようです。
削除もしくはリネームしてくれると嬉しいな・・・は望みすぎでしょうか?

wada4:sample wada$ tree
.
├── samconfig.toml
├── src
│   ├── Function
│   │   ├── index.js
│   │   └── package.json
│   ├── Function2
│   │   ├── index.js
│   │   └── package.json
│   ├── evaluate-code
│   │   ├── index.js
│   │   └── package.json
│   └── send-to-invoice
│       ├── index.js
│       └── package.json
└── template.yaml

生成されたtemplate.yamlの中身はこんな感じになります。
xrayの設定等も自動で入っています。

Transform: AWS::Serverless-2016-10-31
Resources:
  Api:
    Type: AWS::Serverless::Api
    Properties:
      Name: !Sub
        - ${ResourceName} From Stack ${AWS::StackName}
        - ResourceName: Api
      StageName: Prod
      DefinitionBody:
        openapi: '3.0'
        info: {}
        paths:
          /:
            post:
              x-amazon-apigateway-integration:
                httpMethod: POST
                type: aws_proxy
                uri: !Sub arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${EvaluateCode.Arn}/invocations
              responses: {}
      EndpointConfiguration: REGIONAL
      TracingEnabled: true
  EvaluateCode:
    Type: AWS::Serverless::Function
    Properties:
      Description: !Sub
        - Stack ${AWS::StackName} Function ${ResourceName}
        - ResourceName: EvaluateCode
      CodeUri: src/evaluate-code
      Handler: index.handler
      Runtime: nodejs18.x
      MemorySize: 3008
      Timeout: 30
      Tracing: Active
      Events:
        ApiPOST:
          Type: Api
          Properties:
            Path: /
            Method: POST
            RestApiId: !Ref Api
      Environment:
        Variables:
          TABLE_NAME: !Ref CodesTable
          TABLE_ARN: !GetAtt CodesTable.Arn
          QUEUE_NAME: !GetAtt CodesQueue.QueueName
          QUEUE_ARN: !GetAtt CodesQueue.Arn
          QUEUE_URL: !Ref CodesQueue
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref CodesTable
        - SQSSendMessagePolicy:
            QueueName: !GetAtt CodesQueue.QueueName
  EvaluateCodeLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    Properties:
      LogGroupName: !Sub /aws/lambda/${EvaluateCode}
  CodesTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      BillingMode: PAY_PER_REQUEST
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      StreamSpecification:
        StreamViewType: NEW_AND_OLD_IMAGES
  CodesQueue:
    Type: AWS::SQS::Queue
    Properties:
      MessageRetentionPeriod: 345600
  SendToInvoice:
    Type: AWS::Serverless::Function
    Properties:
      Description: !Sub
        - Stack ${AWS::StackName} Function ${ResourceName}
        - ResourceName: SendToInvoice
      CodeUri: src/send-to-invoice
      Handler: index.handler
      Runtime: nodejs18.x
      MemorySize: 256
      Timeout: 30
      Tracing: Active
      Events:
        CodesQueue:
          Type: SQS
          Properties:
            Queue: !GetAtt CodesQueue.Arn
            BatchSize: 1
  SendToInvoiceLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    Properties:
      LogGroupName: !Sub /aws/lambda/${SendToInvoice}
Metadata:
  AWS::Composer::Groups:
    Group:
      Label: group
      Members:
        - CodesTable
        - CodesQueue

今回は、試してみるという観点から、Lambdaのコードは作らず、
このまま、AWS SAMでbuild->deployを実施しましたが、
特に問題なくDeployまで完了しました。

まとめ

  • 自分みたいなCloudFormationのテンプレートファイルを手で書くなんてできない!という人向けかな。
    • AWS CDKあるからいいだろうと思ったりもする。
  • 現状はローカルに生成されたコード、テンプレートファイルをAWS SAMでbuildしてdeployする流れなので、コンソール上でdeployまでできちゃうと本当にQuicklyなのではと思いました。
    • 現段階ではなかなか難しそうですが。
  • Demoだと、AWS Lambdaの関数のコードも生成されるけれど、通常だと、空のLambda関数のコードが出力されるだけなので、結局そこの実装は必要らしい。
    • 無論、Lambdaを挟まないアプリケーションであれば不要なんですが・・・。
  • Demoが進化して、BluePrintとして、いくつかの実装パターンが選べて、必要に応じてLambdaのコードも出てくるようになったらといいんじゃないかなって思う。
  • ふと触ってみて、色々思ったので、FeedBackしてみるのもありかな。と思っています。
    • re:Invent でAWS Application Composerのセッション出たのですが、FeedbackページからFeedBackしてくれよって言っていたと思います。
    • AWS CDK対応もFeedBackに入れてね!っていう話が流れていたような・・・。

という感じで、Public Previewなので、どういう進化を遂げるかわかりませんが、なかなか面白い、ちょっとしたものを作るのには便利になりそうなサービスなんじゃないかと思います。

とりあえずやってみたので、もうちょっと色々作ってみようかなと思います。

Discussion