AWS sam よりも Terraform かなあ。
結論
個人的には AWS sam を使用するよりも Terraform でインフラを管理した方が良いと思う
理由、解説など
しばらく AWS sam を使って AWSリソースの管理をやってきました。
テンプレートの合計行数で言うと 1500行ぐらいになりましたし、そのほとんど全てを私が書いてきたので、それなりに sam に対して思うことが出てきました。
なので今回は sam の旨味について考察してみようと思います😊
AWS sam についての詳細は 公式 に委ねますが、簡単に言うと、AWS の提供する IaC ツールである CloudFormation を拡張したツールです。
何が嬉しいかと言うと、sam はサーバーレスアプリケーションの開発に特化していることです。生の CloudFormation に比べて簡潔な構文で lambda
, DynamoDB
, API Gateway
といったサーバーレスアーキテクチャの中心となるようなリソースを作成することができるものです。
加えて、ローカルでの動作確認用にLambdaに渡すイベントを発火させたりする機能も提供しています。
例(公式から引用):
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Runtime: python3.6
CodeUri: s3://bucket/key
Resources:
ApiGatewayApi:
Type: AWS::Serverless::Api
Properties:
StageName: Prod
Cors: "'*'"
Auth:
DefaultAuthorizer: MyCognitoAuthorizer
Authorizers:
MyCognitoAuthorizer:
UserPoolArn:
Fn::GetAtt: [MyCognitoUserPool, Arn]
みたいに AWS
の後の名前空間が Serverless
になっているリソースをテンプレートの中で宣言できるのが特徴です。
sam で何が辛かった、あるいは微妙なのか
- 純粋な CloudFormation ならできることが出来ない
- ローカルでの開発機能を提供しているが、 Lambda が コンテナイメージをサポートした ことにより「Docker で確認すれば良くない?」ということになった
- (これは sam というより CloudFormation ですが。。。)エコシステムが充実していない
1について
内容の通りですが、ちょくちょくこういうことがあります。。。
CloudFormation にはスタックの管理下に無い AWSリソースのインポート機能があります。これは Terraform も提供しているものです。
ただし、私が開発していた数ヶ月前なら少なくとも、純粋な CloudFormation のやり方ではリソースの import ができませんでした。調べてみましたが、どうやら sam 固有の機能があるわけでもなさそうでした(あったらすみません)。
これは非常に不便、かつ時にはクリティカルな問題を引き起こします。
Terraform なら簡単にできることだったりします😅
2について
re:Invent 2020 にて発表された新機能です。
従来は zip 形式に圧縮したコードの成果物を lambda にアップロードして、エントリーポイントとなるメソッドなりを予め定義しておきました。
しかし ECR に push した Docker イメージをLambdaの起動にそのまま使えるという、個人的には非常に嬉しいアップデートが登場しました!!
それに加えてローカルでのテストに最適な AWS Lambda Runtime Interface Emulator (RIE) の提供も開始されました。
コンテナベースになることによって docker-compose を使ってよりリアルなマイクロサービスアーキテクチャのテストができるようになるのではないでしょうか。
あまり sam の機能としてテストする旨味は感じられなくなったかもしれません🧐
3について
タイトル通りです。
Terraform であれば、 terraform plan
を行った結果を GitHub PR に添付してくれる(めちゃくちゃ便利) tfnotify や lint ツールなども充実しています。
情報も多いです。
CloudFormation もエコシステムの構築は頑張ってはいるようですが、どうしても AWS でしか使えないツールなので、CloudFormation そのものを使いやすくするエコシステム構築はいまいち捗っていない印象です。
まとめ
他にも、
- 簡潔に書けるとは言ってもそこまで?
- 痒いところに手が届かない
- 細かい設定をしようとすると結局 sam のメリットを捨てることになりがち
など諸々理由はあります。
スピードが何よりも重視される場合にはアリかもしれませんので絶対無しではありませんが、 「 Terraform の方が良いかなあ」 感は拭えません。
以上、現場からでした🐳
Discussion
感想です。
私は今のところSAMしか使ったことがないですが、ここ記載いただいてることと同じことを常に感じてましたので、一般的にも同じ意見なのかと思いホッとしています。
特に1の、CloudFormationに有るがSAMにない機能がある、というのは致命的ですよね。
私の中ではもう一点、ドキュメントが分かりにくいのが使いづらいポイントです。
これからはSAMではない手段でデプロイしていくようにしようかな…