6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

最近ランサムウェアの被害がニュースにでており、被害のあった企業は大きな損害を被っています。ランサムウェア対策ではバックアップを堅牢に保つことが重要であると考えています。
AWS Backupにはボールトロックという機能があります。
これを使うと設定した保持期間はIAMの権限に関係なく消すことができなくなります。

{8A8B9F9E-125E-4504-9CAC-C0491F79CF38}.png

AWS Backupと同じようなバックアップサービスとしてライフサイクルマネージャ(DLM)の存在があります。こちらはデータを世代数でも管理できることと、バックアップ操作が指定した時刻となるためAWS Backupに比べて制御しやすいサービスだと考えています。

AWS Backup、DLMいずれも、バックアップの実態はスナップショットなのですが、DLMにはロックをかける設定項目はありません。代わりに取得したEBSスナップショットにてスナップショットロックという設定をかけることが可能です。

{258B5594-A707-4DEC-84FA-90AF617A3E08}.png

ただDLMで取得したスナップショットをいちいち手動でロックをかけていくのは、現実的ではないのでDLMで取得したスナップショットの自動的にロックする仕組みを考えます。

ここから今回の目的であるKiroを使っていきます!
まずは以下のように要件を整理しました。

目的

ライフサイクルマネージャで取得したバックアップのスナップショットロックの設定自動化

要件

・DLMで取得したAMIやEBSスナップショットを指定した日数でスナップショットロックを設定したい。DLMで取得後にスナップショットを設定するジョブが起動するイメージ。
・AMIの場合はAMIに紐づくEBSスナップショットすべてにスナップショットロックを適用。
・DLMが世代数または保持期間でデータを保持するため、世代数または保持期間から外れた際にDLMが削除できるようにスナップショットロックの保持期間を設定する。
・スナップショットロックのロックモードはガバナンスモードを指定。
・汎用的に実装が可能となるように、Cloudformationで実装できるようにする。

kiroには要件定義から実装まで一連の流れをこなすSPECと呼ばれるチャット機能がついています。
{FA078AE7-1E79-48C3-A180-AEC8612743EC}.png

早速上にあげた要件を打ち込んでみます。

{F2D77947-68DC-44EB-B9AC-4898CE21537C}.png

数分すると
要件定義書がでてきました。

{F1A917DC-6FD2-44D8-8001-8476463F4F0E}.png

要求事項については英文だったので、copilotに日本語で要約してもらいました。

要約(日本語)

この要件は、AWSのDLM(Data Lifecycle Manager)で作成されたAMIやEBSスナップショットに対して、自動的にスナップショットロックを適用し、データ保護とライフサイクル管理を両立する仕組みを定義しています。主なポイントは以下の通りです。

スナップショットロックの自動適用

DLMがAMIやEBSスナップショットを作成した際、自動でロックを適用
ガバナンスモードを使用し、保持期間はDLM設定と整合性を取る
DLMによる正当な削除を妨げない仕組み

CloudFormationによるデプロイ対応

CloudFormationテンプレートでシステムを構築可能
パラメータでロック期間やDLMポリシー連携を設定
スタック更新時にデータ損失がないこと

カスタムロック期間の設定

スナップショット種別ごとに保持期間を柔軟に設定可能
DLMポリシーとの整合性を検証し、競合時は警告と安全なデフォルト値を使用

ログと監視の強化

ロック操作の詳細ログ(タイムスタンプ、リソースID)
エラー時の詳細記録、CloudWatch連携による監視・アラート
成功/失敗のメトリクス提供

ログと監視強化までは要件にはいれていませんでしたが、しっかりと要件定義書に入っています。
Kiroから問題なければ設計フェーズに進むかと聞かれているので、このまま次に進みます。
{C382237F-DDC5-4EE1-8E73-E86B7716DE89}.png

続いて設計フェーズのドキュメントがでてきました。(こちらも数分です)
{6AE10EAA-3D5C-4039-A3A6-8F7F9A46B2B8}.png

アーキテクチャ
この設計書によるとDLMが動いた際にEvenbridgeで検知し、Lambda関数からスナップショットロックのAPIを呼び出す流れとなっています。
{1F449EBA-0F17-4337-ABAD-DB710DFE3367}.png

さらに利用するサービスごとに設計内容が記載されています。
{7600EADE-5D79-4276-AD43-6F8211FA010A}.png

こちらも問題なさそうなので続いて実装計画に進んでみます。
{FBB60114-EDD7-4A35-A7CE-B33E174520C8}.png

実装計画に進むと実装計画の特徴とタスクの構成についての説明があり、実際のタスクのドキュメントが作られています。
{BB3088DE-98A4-4889-866F-67C1B28830DA}.png

タスクを進めるにあたり、コア機能の実装のみ進めるか、オプションも含めたすべてのタスクを実行するか選択できるようです。
{E6B3A256-2760-4125-BD5E-0252A1770D3F}.png

今回オプションは保持したまま進みます。
{AA74C263-3FC0-4C8E-AD66-44A1AC42B4C1}.png

タスクリストのドキュメントを開き、「Start task」をクリックするとタスクが実行されます。
{2BDFBBA1-507A-4ED4-9D32-5FF85BFD8D76}.png

以下のようにTask1の内容が進んでいきます。
{9EB1C959-0FBE-4932-B36F-5C8BF3B6682B}.png

途中、デプロイのためスクリプトに実行権限を付与しようとしますが、私の環境がWindowsのため失敗します。

{242EAD48-8E8B-4C2B-964B-8B612F9513BF}.png

あとで自分のAWSアカウントに入って、cloudshellから実行するのでいったんこちらはそのまま進めます。

しばらくするとTask1が完了し、次の成果物ができました。
{B91FA125-FCD4-4DF1-8322-457538790239}.png

{9E13B88C-534D-4BF5-8AB0-A18C1B67B3D0}.png

Task1ではディレクトリ構成やcfnテンプレート、lambda関数、readmeなど、このアプリケーションの全体像が作られているようなイメージです。

続けてTask2を実行してみます。Task2ではさらにlambdaの処理を追加しているようです。
{3CC6B800-1EDB-4C8A-97EF-97DA942EF542}.png

{3A92842F-36CD-4CD9-B8F3-A8A536EFDA78}.png

続いてTask3です。Task3ではsnapshot lockに関する実装となります。
{B658E083-585F-4EB3-BAE5-45B1BF06CB77}.png

{DF532D95-8A3A-4EAE-9544-2B7CE10C3184}.png
{6E724722-DAAC-409E-A45B-5C728F49BDBE}.png

続いてTask4
{29FDDAA6-5572-4BFE-BDE0-A686882D9DB8}.png

実行途中にまたしてもpythonのコマンド実行がでてきたので、microsoft storeからpythonをインストール。

{DE411A5E-9CE6-4295-B3CD-0BB71C5156A5}.png

いったんkiroを閉じて再度開いてみるとTask実行がabortしていましたが、隣にretryがあったので
Retryしてみます。

{B1B8C16B-AF8E-4CC8-9C19-95C82A20C440}.png

Task4も無事成功です。
{ABCE39EE-F55B-41DC-9CF5-4C67E3BD5702}.png

ようやく半分まで来ましたが、まだまだ続きます。続いてTask5にまいりましょう。
Task5は最初に伝えていなかったログと監視についてですね。
{3C7DB1A8-C56A-409E-BA51-8F210F73C169}.png

途中pytestコマンドで何度か確認するのですが、失敗すると失敗原因を調査してコードを修正し再度テストを繰り返す動きをします。

{5FABD11E-AF81-458C-A997-792338F6CA6A}.png

Task5も完了!
{315B805D-BBB3-4B93-B78A-B338E1A74900}.png

次はTask6、Cloudformationのテンプレートについての実装です。
{3B2D9EEB-7910-455B-973F-3711891C9AF9}.png

Cfnは形式がきまっているのかあっさり終わりました。
{EFB48B79-3EA9-4F27-B65C-ED889B9A742C}.png

続いてTask7はオプショナルなのでTask8を実行します。
Task8ではテストとなっています。
{F9331019-02E3-45FB-9A10-19E1ABA375F3}.png

途中エラーがでたりしますが、すべて必要な解決策を自分でこなしながら完了までもっていきます。

{21A9E743-D590-4F97-8469-3415F19D3A0F}.png

続いてTask9にうつります。
{B997F2BB-AF48-42DD-AB68-9EA98D1A524F}.png

と思ったらCreditsが残り20%以下なのでPlanのUpgradeをすすめられました・・・

{27A89DB1-3437-47B6-95F5-6C4B77BF9CDB}.png

フリープランだと厳しいですね。
{10331620-0F55-4082-A6A8-B60E1B5C01FC}.png

もう少しこのまま粘ります
何とかTask9も完了しました。Task9はCloudformationのデプロイガイドになります。
{DBA1BDDE-49BF-4D93-98F5-3E0D6EC53F74}.png

この時点であと6Creditです・・・
{B01C7904-4916-4F43-ACD7-D8DF0B16E932}.png

最後のタスクいってみましょう
{3FCB284C-870B-43C9-A5B7-E70B3DCBFE0E}.png

途中でCreditがつきてしまいました・・・
{1B2C4F45-99FF-4EB1-97EF-5E5020D1939B}.png

Creditは毎月1日にまた戻るようですが、FreePlanではちょっと力不足ですね。
Proだと1000Creditですが、今回のペースを考えると1000でもすぐに使いきってしまいそうです。
ちなみにProプランは$20です。ただ月に$20払ってここまで自律的に作業してくれる助手がいると思えばはるかにコストメリットは大きいのではと思います。

今回は実際に成果物を動かせていないのでKiroがどれぐらい使えるのかはっきりとはいえませんが、
自分のやりたいことを伝えるだけで要件定義~実装までこなす力はやはり凄いと言わざるを得ません。
これまで人が時間をかけてきたことが数分でできてしまう。これからは本当にいい道具を使っていかに早くサービスを提供できるかが生き残るための鍵ではないかと今回の検証を通して感じさせられました。

今回の続きはまた1月にやりたいと思います。

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?