みなさん、AWS Systems Manager は使っていますでしょうか。 Systems Manager といってもたくさんの機能があり、便利にインスタンスへ SSH できる Session Manager や、インスタンスのパッチ管理を自動で行う Patch Manager など様々な機能が提供されています。
Systems Manager の中に「Automation」という機能があります。これは runbook と呼ばれる YAML/JSON 形式のドキュメントに処理内容を記載することで簡単に自動で AWS リソースの修正ができるよ、というサービスです。
自動化?ドキュメントの作成...?ちょっとめんどくさそうだなぁと思ってしばらく触らずにいましたが、実際に触ってみると 実用的なサンプルの runbookがある、 コンソールから手軽に実行を試せる など、かなりとっかかりやすい機能でした。 本ブログではまだ AWS Systems Manager Automation を使ったことがないエンジニア向けに AWS が用意したマネージドな runbook を実際に実行してみる手順を紹介します。
概要
AWS Systems Manager Automationとは
オートメーションは、AWS のサービス (Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Relational Database Service (Amazon RDS)、Amazon Redshift、Amazon Simple Storage Service (Amazon S3) など) でのメンテナンス、デプロイ、および修復に関する一般的なタスクを簡素化するための AWS Systems Manager の機能です。 https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-automation.html
AWS Systems Manager には AWS 環境におけるインフラやアプリケーションの管理を簡単にするためのツールが様々含まれています。そのうちの1つである「Automation」はタスクの自動化に特化したサービスです。
自動化の内容は runbook と呼ばれる YAML/JSON 形式のドキュメントに記載します。デフォルトで AWS より提供されている runbook があり、コンソールから手軽に実行を試すことができます。もちろん自前で用意も可能です。EC2 インスタンスの起動や停止などにとどまらず、設定の変更など様々自動化を行うことができます。
Automation のカスタマイズ性は非常に高く、実行の内容だけでなく実行のトリガーをカスタマイズも可能です。CloudWatch のメトリクスをトリガーにして runbook を実行したり、Security Hub、Config の検知をトリガーにして runbook の実行が可能です。
これらの AWS Systems Manager Automation の機能を活用することで、AWS インフラ運用に携わるエンジニア、社内の AWS 環境を管理するエンジニア、セキュリティ面での対応を担当するエンジニアなど様々なロールのエンジニアの業務効率化に貢献できます。
本ブログで取り上げる内容
本ブログでは AWS Systems Manager Automation の機能を活用して実際に作られた問題があるリソースをコンソールから runbook を実行して修正を試みます。 Automation を用いることで「大量に実行する処理」や「手順が複雑なタスク」を自動化し、業務効率化に貢献できることを体感していただければと思います。 runbook は Config や Security Hub、CloudWatch など様々なトリガーを起点に自動で実行できますが、それはまた別の記事で取り上げます。
実践編 - コンソールからサンプルの runbook を実行する
本章では外部に公開された S3 バケットを作成し、そのバケットの外部公開設定を閉じる runbook を実行する手順を紹介します。 S3 バケットの外部公開設定を閉じる runbook は AWS Systems Manager Automation にデフォルトで用意されており、実行することで外部公開を閉じることができます。
デフォルトで用意されている runbook は AWS Systems Manager の Automation から Execute のボタンを押すことで確認できます。
https://ap-northeast-1.console.aws.amazon.com/systems-manager/automation/execute/
1. 外部公開された S3 を CloudFormation で作成
以下の CloudFormation テンプレートを使って、外部公開された S3 バケットを作成します。 インターネット上に公開されたバケットを作成するため、会社の AWS アカウントで適用したり放置したりしないよう注意してください。
AWSTemplateFormatVersion: "2010-09-09" Description: "S3 Bucket with Public Access Allow Configuration" Resources: S3BucketSamplePublicReadAllow: Type: "AWS::S3::Bucket" Properties: BucketName: !Sub "sample-public-read-allow-${AWS::AccountId}" PublicAccessBlockConfiguration: BlockPublicAcls: false IgnorePublicAcls: false BlockPublicPolicy: false RestrictPublicBuckets: false S3BucketSamplePublicReadAllowPolicy: Type: "AWS::S3::BucketPolicy" Properties: Bucket: !Ref S3BucketSamplePublicReadAllow PolicyDocument: Statement: - Effect: "Allow" Principal: "*" Action: "s3:GetObject" Resource: !Sub "arn:aws:s3:::${S3BucketSamplePublicReadAllow}/*"
CloudFormation 適用の詳細手順
- 上記のテンプレートをコピーし、ファイルに保存
- CloudFormation のコンソールへアクセス
- 「スタックの作成」から「新しいリソースを使用(標準)」を選択
- テンプレートの指定欄で「テンプレートファイルのアップロード」を選択し、上記のテンプレートファイルをアップロード
- スタック名として任意の名前を設定し、「次へ」
- スタックオプションの設定はデフォルトのまま、「次へ」
- 確認して作成に表示される内容を確認し、「送信」
- 少し待つとスタックのステータスが「CREATE_IN_PROGRESS」から「CREATE_COMPLETE」に変わり、バケットが作成される
2. 作成した外部公開バケットを確認
外部からアクセスできることを確認
インターネットから 1. で作成した S3 バケットに外部からアクセスできることを確認します。 適当なファイルを用意し、S3 バケットにアップロード、ファイルの URL を取得し、ブラウザでアクセスしてファイルが表示されることを確認します。
ファイルのアップロードと外部アクセス確認の詳細手順
- S3 のコンソールへアクセス
- で作成したバケット
sample-public-read-allow-<<AWSアカウントID>>
を選択
- で作成したバケット
- 「アップロード」をクリックし、txt ファイルなど適当なファイルをアップロード
- ステータスが成功になったことを確認し、「閉じる」
- アップロードされたファイルをクリックし、詳細画面から「オブジェクト URL」をコピー
- ブラウザでコピーした URL にアクセスし、ファイルが表示されることを確認
外部公開設定の内容を確認
作成した S3 バケットの「アクセス許可」タブよりどのように外部公開の設定が行われているかを確認します。
ブロックパブリックアクセスポリシーにはなにもチェックがなく、アクセスブロックをしない状態になっています。バケットポリシーには Principal: "*"
と書かれておりインターネットからを含むあらゆるユーザに s3:GetObject
が許可されていることが確認できます。
3. runbook を実行する
コンソールから runbook を実行して、外部公開設定を閉じます。
- AWS Systems Manager の Automation 画面を開く
- 「Execute automation」をクリック
- 「AWS-DisableS3BucketPublicReadWrite」を検索し、「Next」
- Input Parameters に以下の内容を入力し、「Execute」
- Execution detail の画面に遷移するので Overall Status が Success となれば成功
4. 実行結果の確認
実際に外部公開設定が閉じられていることを確認します。 ブラウザでサンプルとして置いたファイルの URL にアクセスし、ファイルが表示されないことを確認します。 またどこの設定が変更されたか、S3 バケットの詳細画面から確認します。
「任意のアクセスコントロールリストを介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする」「任意のパブリックバケットポリシーまたはアクセスポリシーを介したバケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックする」にチェックが入りブロックされていることがわかります。
まとめ
本ブログでは AWS Systems Manager Automation の機能を活用して、外部公開された S3 バケットの設定を閉じるサンプルの runbook を実行する手順を紹介しました。自動化といえどかなり手軽にできることがわかります。 実際に業務で利用する際には「独自のユースケースに沿った runbook を作成する」「検知されたものを自動で修復する」、「AWS Organizations に向けて同様の runbook を展開する」など様々な課題があります。それらについてはまた別の機会に取り上げたいと思います。まずはいろいろなサンプルの runbook を実行してみて、AWS Systems Manager Automation の機能を体感してみてください。
宣伝
現在、AWS Community Builder である @nishikawaakira と一緒に AWS Systems Manager Automation のワークショップを企画しています。オリジナルの runbook を作成する手順を体験しながら、Automation の機能や使い方について学ぶことができるワークショップを実施する予定です。 詳細は決まり次第 X(旧 Twitter) 等でアナウンスするのでご興味のある方はぜひフォローをお願いします。