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 DynamoDB のアプリケーションになります。

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 なので、どういう進化を遂げるかわかりませんが、なかなか面白い、ちょっとしたものを作るのには便利になりそうなサービスなんじゃないかと思います。
とりあえずやってみたので、もうちょっと色々作ってみようかなと思います。
アイレットなら、AWS で稼働するサーバーを対象とした監視・運用・保守における煩わしい作業をすべて一括して対応し、経験豊富なプロフェッショナルが最適なシステム環境を実現いたします。AWS プレミアティアサービスパートナーであるアイレットに、ぜひお任せください。
その他のサービスについてのお問合せ、お見積り依頼は下記フォームよりお気軽にご相談ください。
https://www.iret.co.jp/contact/service/form/