📝

EC2 インスタンスの停止、AMI 取得、EC2 インスタンス起動を行う Step Functions ステートマシンを作成してみた

に公開

シンプルな内容で AI に作成してもらいました。

コード

コード
{
  "Comment": "EC2インスタンスの停止、AMI作成、EC2インスタンス起動のワークフロー",
  "StartAt": "StopEC2Instance",
  "States": {
    "StopEC2Instance": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ec2:stopInstances",
      "Parameters": {
        "InstanceIds": [
          "i-xxx"
        ]
      },
      "Next": "WaitForEC2Stopped"
    },
    "WaitForEC2Stopped": {
      "Type": "Wait",
      "Seconds": 10,
      "Next": "CheckEC2Status"
    },
    "CheckEC2Status": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ec2:describeInstances",
      "Parameters": {
        "InstanceIds": [
          "i-xxx"
        ]
      },
      "Next": "IsEC2Stopped"
    },
    "IsEC2Stopped": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.Reservations[0].Instances[0].State.Name",
          "StringEquals": "stopped",
          "Next": "CreateAMI"
        }
      ],
      "Default": "WaitForEC2Stopped"
    },
    "CreateAMI": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ec2:createImage",
      "Parameters": {
        "InstanceId": "i-xxx",
        "Name": "AMI-Backup"
      },
      "ResultPath": "$.CreateAMIResult",
      "Next": "SaveImageId"
    },
    "SaveImageId": {
      "Type": "Pass",
      "Parameters": {
        "ImageId.$": "$.CreateAMIResult.ImageId"
      },
      "ResultPath": "$.SavedImageId",
      "Next": "WaitForAMIAvailable"
    },
    "WaitForAMIAvailable": {
      "Type": "Wait",
      "Seconds": 30,
      "Next": "CheckAMIStatus"
    },
    "CheckAMIStatus": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ec2:describeImages",
      "Parameters": {
        "ImageIds.$": "States.Array($.SavedImageId.ImageId)"
      },
      "ResultPath": "$.ImageStatus",
      "Next": "IsAMIAvailable"
    },
    "IsAMIAvailable": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.ImageStatus.Images[0].State",
          "StringEquals": "available",
          "Next": "StartEC2Instance"
        }
      ],
      "Default": "WaitForAMIAvailable"
    },
    "StartEC2Instance": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ec2:startInstances",
      "Parameters": {
        "InstanceIds": [
          "i-xxx"
        ]
      },
      "End": true
    }
  }
}

処理フロー

  1. EC2 インスタンスを停止
  2. EC2 インスタンスの状態が stopped になるまでループ
  3. EC2 インスタンス停止後に AMI 取得
  4. AMI の状態が available にまるまでループ
  5. AMI 作成完了後、EC2 インスタンスを起動

なお、EC2 インスタンス ID はハードコーディングです。
また、今回は Step Functions の IAM ロールに AdministratorAccess 権限を付与しましたが、ベストプラクティスに沿って必要な権限のみ付与することを推奨します。

まとめ

今回は EC2 インスタンスの停止、AMI 取得、EC2 インスタンス起動を行う Step Functions ステートマシンを AI に作成してもらいました。
どなかの参考になれば幸いです。

Discussion