AWS Application Composerを試してみた所感
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に沿ってやってみます。
最初の方は、基本一緒で、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