LoginSignup
2
0

【AWS】今日から使える!StepFunctionsで環境全起動!

Last updated at Posted at 2023-12-21

皆さんはこう考えたことはありませんか?

  • 使わない間AWSのリソースを停止してる
    • 1個ずつ起動するの面倒。。。
    • ボタン一つで指定したリソース起動できたらなぁ〜

それ、 StepFunctions で実現できます:thumbsup:

そんなあなたに! AWSの StepFunctions!
AWSのAPIを使ったワークフローで簡単に指定したリソースを起動することができます!

前提1

今回の前提として下記のリソースを起動します

リソース種別 台数 備考
RDSインスタンス 1
Auroraクラスタ 1
EC2 5
EC2 AutoScaling Group 1 ASGの個数は2つ

前提2

下記のポリシーをアタッチしたIAMロールを作成し、StepFunctionsステートマシンに割り当てていること。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBInstances",
                "rds:DescribeDBClusters",
                "rds:StartDBCluster",
                "rds:StartDBInstance",
                "ec2:DescribeInstanceStatus",
                "ec2:DescribeInstances",
                "ec2:StartInstances",
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:ExitStandby",
                "autoscaling:UpdateAutoScalingGroup"
            ],
            "Resource": "*"
        }
    ]
}

全体の構成

image.png

流れとしてはこうなっています。

  1. DBクラスタの状態を取得
  2. 停止している場合起動
  3. 起動完了したらDBインスタンスの状態を取得
  4. 停止している場合起動
  5. 起動完了したらEC2インスタンスの状態を取得
  6. 停止している場合5台全て起動
  7. 起動完了したらAutoScaling Groupのキャパシティを取得
  8. 0の場合1に変更しキャパシティを増やす

上記画像のように上から下に流れる形で順序立てて起動させることができます。
では実際に細かく説明していきます

DBクラスタの起動

最初にAuroraのクラスタを起動させていきます

DBクラスタの状態取得

まず左のメニューから「Describe DBClusters」を検索し、配置します

スクリーンショット 2023-12-07 18.12.10.png

配置したら右のメニューに以下を入力します。

スクリーンショット 2023-12-07 18.15.38.png

{
  "DbClusterIdentifier": "kensyo-aurora"
}

これでDBクラスタ名を使ってDBクラスタの状態を取得することができます(Stopped or Available)

次に状態を取得したらその情報を次のフローへ出力するように設定します。
出力タブを開き以下のように設定します。

スクリーンショット 2023-12-07 18.19.17.png

{
  "DbClusterStatus.$": "$.DbClusters[0].Status"
}

状態による分岐

ここからはクラスタの状態によって動きを分岐させていきます。
左のメニューのフローから「Choice」を選択して配置します。

スクリーンショット 2023-12-07 18.22.42.png

スクリーンショット 2023-12-07 18.23.46.png

では、まずRule1を編集していきます。
鉛筆マークを押して、AddConditionsをクリック

image.png

ここで、先程DescribeDBClusterから出力をした、「$.DbClusters[0].Status」の中身を使って分岐をしていきます。
以下のように設定してまずは停止だった場合の条件にします。
image.png

では次にAdd New Choice Ruleをクリックし逆に起動していた場合の条件も入力します。
image.png

指定する状態として実際にaws cliで確認したところ以下で返ってきたため、こんな感じで指定しています。
停止している場合: Stopped
起動完了している場合 : available

Ruleが増えたのでこの様になっているかと思います
image.png

分岐させる場合、このように各Ruleの下に次に行いたいアクションを配置していく形になります。

DBクラスタの起動

ではまず、DBクラスタを起動させる動きを入れていきましょう!

左メニューから「StartDBCluster」を検索して stopped の下に配置します。

スクリーンショット 2023-12-07 18.34.28.png
image.png

次に、DBクラスタの起動は時間がかかるため、その間の待機をさせるためにフローからWaitを配置します
(スクリーンショットが取れなかったですが、ハイライトが出ます)

スクリーンショット 2023-12-07 18.37.49.png
image.png

無事に配置ができたら StartDBCluster にクラスタ名を指定します。
image.png

ループの設定

次にWaitの設定を行います。
今回は2分ずつ待つことにします。

image.png

Waitでやりたいことは

  • 起動完了まで状態確認を繰り返す
  • 起動中も繰り返したい

上記を実現するため細工をしていきます。
まず、Waitの次の状態を Describe DBClustersへ
次に、ChoiceのDefault ruleの次の状態をWaitにします。
image.png

image.png

そうするとこの状態になったと思います。
image.png

ぐちゃぐちゃですが、
起動の動作が終わったあと2分待って、状態を取りに行きます。
そして、その状態が stopped でも available でもない場合、また2分待って状態を取得する
以上を繰り返して、 availableが取れたときに次の動作に移ります。

これだと時間がかかってしまいますのでフローの中のParallelを使ったほうがもっと効率よくできますが、今回は初めてだったためこの方法で実装してみました。

DBインスタンスの起動

クラスタのときとほぼ変わらないので割愛しますが、パラメータが多少違うため記載します。
image.png

状態の取得

同じ流れで設置、設定していきます。
スクリーンショット 2023-12-07 18.37.49.png

image.png

{
  "DbInstanceIdentifier": "RDS-kensyo"
}

image.png

{
  "DbInstanceStatus.$": "$.DbInstances[0].DbInstanceStatus"
}

分岐

image.png

image.png

image.png

image.png

DBインスタンスの起動

スクリーンショット 2023-12-07 18.57.33.png

image.png

image.png

image.png

image.png

ループの設定

image.png

image.png

image.png

EC2インスタンスの起動

EC2の起動も同じような形で配置していきます。
今回対象のインスタンスは5台となっています。
5台の状態を取得し、起動します。

image.png

状態の取得

image.png

# APIパラメータ
{
  "Filters": [
    {
      "Name": "tag:Name",
      "Values": [
        "aaa",
        "test",
        "dev",
        "kensyo",
        "prod"
      ]
    },
    {
      "Name": "instance-state-name",
      "Values": [
        "stopped"
      ]
    }
  ]
}

image.png

{
  "StoppedInstanceCount.$": "States.ArrayLength($.Reservations)",
  "StopInstanceIds.$": "$.Reservations[*].Instances[0].InstanceId"
}

出力に関して

"States.ArrayLength($.Reservations)", の部分では、インスタンスの台数を出力しています。
APIパラメータで指定した、

      "Name": "instance-state-name",
      "Values": [
        "stopped"

上記の部分で、stoppedのインスタンス情報が取れているため、その配列のlengthを出力しています。

"$.Reservations[*].Instances[0].InstanceId"の部分では、停止しているインスタンスIDを出力しています。

状態での分岐

image.png

条件に関して

今回インスタンスが5台という条件(状態を取得するインスタンスが5台)ですので、
「5台停止していたら起動し、停止しているインスタンスが0台になったら次のフローに移る」 動きにしています。
これに関してはもっと良いやり方があると思いますが今回はこの条件で実装していきます。

EC2インスタンスの起動

image.png

{
  "InstanceIds.$": "$.StagingStopInstanceIds"
}

実は、インスタンスの状態取得時に出力したインスタンスIDの配列はChoiceを通して取得することができます。
よって、InstanceIdsにその配列をそのまま指定しています。
これで5台一気に起動することができます。

Wait

Waitも同じように設定し、ループをさせます。

AutoScalingGroup(ASG)のキャパシティ変更

2つのAutoScalingGroupを対象にキャパシティ変更による、インスタンスの起動を実装していきます。
初期状態は、

  • 希望するキャパシティ : 0
  • 最小キャパシティ : 0
  • 最大キャパシティ : 1

とします。

image.png

状態の取得

まずは対象のASGの状態を取得し、出力します。
image.png

{
  "AutoScalingGroupNames": [
    "kensyo",
    "kensyo2"
  ]
}

image.png

{
  "StagingInstanceId.$": "$.AutoScalingGroups[0].Instances[0]",
  "StagingInstanceId2.$": "$.AutoScalingGroups[1].Instances[0]"
}

もっといい方法がありそうですが、配列の添字を入力しそれぞれ取得します。

状態での分岐

image.png

Rule1には、条件として、初期状態の希望するキャパシティと最小キャパシティが0の場合、配列が Null であるため、
Nullの条件を指定してあげる必要があります。
image.png

Rule2は、$.StagingInstanceId.LifecycleState$.StagingInstanceId2.LifecycleStateの値が "InService" となったら次のフローに移ります

AutoScalingGroupのキャパシティ変更

2つのASGを一度に変更することが難しかったため、2つのフローに分けて実装します。
最小キャパシティと希望するキャパシティを1にしてインスタンスを起動させます。

image.png

image.png

# 1つ目

{
  "AutoScalingGroupName": "kensyo",
  "MinSize": 1,
  "DesiredCapacity": 1
}

# 2つ目

{
  "AutoScalingGroupName": "kensyo2",
  "MinSize": 1,
  "DesiredCapacity": 1
}

Wait

同じように配置し、ループさせます。

終わり方

今回は、ASGの更新で処理を終わらせたいため、InServiceの条件の下にフローからpassを配置して、そのままENDまで流れるようにしています。

image.png

実行

ここまでできたら、右上の実行を押して、実行するだけです!
実行を押すと、下記の画面が出ますが、何も入力せずそのままでOKです!

image.png

作ってみて

ピタゴラスイッチのような感覚で、APIアクセスを使用してAWSリソースを操作できるため、起動だけでなくその逆の停止や、情報の書き換えなど、
EventBridgeなどと組み合わせると日時指定での実行も可能なため更に幅広い操作が可能だと思いました。
GUI形式で簡単に配置できるため、わかりやすく作成することができました!
今回のような内容のときは積極的に使っていきたいですね!

最後に

若干ごちゃごちゃとした内容になってはしまいましたが、どなたかの参考になれば幸いです。
みなさんも良いStepFunctionsライフを:thumbsup:

2
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
2
0