はじめに
Cloud Custodianで特定のタグがついているEC2を定期的に起動停止することをやってみました。
今回Cloud Custodianで作成するのはLambda、EventBridgeです。
Cloud Custodianとは
CNCFの一つのプロジェクトで、AWS、Azure、Google Cloud Platformなどのクラウドインフラストラクチャ上に存在するリソースの管理と保護を行うオープンソースのツールです。
https://cloudcustodian.io/
まず用意するもの
Lambdaが使用するロールをEC2の操作をできるようにポリシーを含んだ状態で用意する。下記が例
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Effect": "Allow",
"Resource": "arn:aws:logs:*:*:*"
},
{
"Action": [
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:DescribeInstances"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
EC2に任意のタグを用意する。下記が今回用意したもの
key:autoStartStop
value:true
Cloud Custodianをインストール
pip install c7n
Custodianで使用するポリシーファイルを作成する。
ファイル名:ec2-start-stop.yml
policies:
- name: ec2-auto-start
resource: aws.ec2
mode:
type: periodic
schedule: "cron(10 12 * * ? *)"
role: "arn:aws:iam::xxxxxxxxxxx:role/xxxxxxxxx" # 事前に用意したロールARNを追加
filters:
- "tag:autoStartStop": "true"
actions:
- start
- name: ec2-auto-stop
resource: aws.ec2
mode:
type: periodic
schedule: "cron(0 12 * * ? *)"
role: "arn:aws:iam::xxxxxxxxx:role/xxxxxxx" # 事前に用意したロールARNを追加
filters:
- "tag:autoStartStop": "true"
- "State.Name": "running"
actions:
- stop
コードの解説
resource: aws.ec2はポリシーが適用されるAWSリソースタイプを指定します
type: periodicはperiodicを指定することで、ポリシーが定期的に実行されます
schedule: "cron(0 12 * * ? *)"は実行されるタイミングをcron式で指定します。(0 12 * * ? *の指定はテストのためこの時間にしています。。。)
role: "arn:aws:iam::xxxxxxxxx:role/xxxxxxx"はLambda関数に適用されるIAMロールのARNを指定します
filters:はautoStartStopタグがtrueに設定されたEC2インスタンスに対してのみポリシーが適用されます
actions:はフィルタリングされたリソースに対して実行される操作を定義します
Custodianを実行する
※実行する前にAWSの認証情報の設定を行なってください。
下記コマンドで実行する
custodian run -s output ec2-start-stop.yml
実行すると
こちらのようなLambdaとEventBridgeが作成される。
このようにポリシーを作成し実行することで簡単にLambdaとEventBridgeが作成されます。
最後に
Cloud Custodianを使用することで簡単にEC2を定時起動と停止を構築することができました。
もうすこしCloud Custodianで難しい処理や複数アカウントでの実装方法を勉強したいと思いました。