Para crear una máquina de estado, se utiliza la consola de AWS Step Functions. Step Functions es un servicio web que permite la coordinación de componentes de aplicaciones y microservicios distribuidos mediante flujos de trabajo visuales. Las funciones de Lambda se invocan cuando la máquina de estado se ejecuta y alcanza el estado de Tarea.
Para este proyecto, la máquina de estado realiza las siguientes tareas:
- Genera un creador de imágenes de AppStream 2.0.
- Obtiene el estado del creador de imágenes y la flota de AppStream 2.0.
- Envía una URL de streaming.
- Obtiene el nombre de la imagen de AppStream 2.0.
- Crea una flota y una pila de AppStream, y asocia la flota a una pila.
- Detiene la flota y el creador de imágenes de AppStream 2.0.
Para crear la máquina de estado, realice los siguientes pasos:
- Para abrir la consola de AWS Step Functions, vaya a https://console.aws.amazon.com/states/.
- Aplique alguna de las siguientes acciones:
- Si no ha creado ninguna función de máquinas de estado, aparece la página de Introducción. Elija Introducción y luego Máquinas de estado.
- Si ya creó una función de máquinas de estado, en la esquina superior derecha de la página Máquinas de estado, elija Crear máquina de estado.
- En la página Definir la máquina de estado, deje la opción Crear a partir de fragmento de código seleccionada.
- En la sección Tipo, deje Estándar seleccionado.
- En la sección Definición de la máquina de estado, elimine el código de marcador de posición y pegue el siguiente código en la ventana de edición.
{
"StartAt": "Create Image Builder",
"States": {
"Create Image Builder": {
"Type": "Task",
"Resource":
"arn:aws:lambda:<REGION-CODE>:<AWS-ACCOUNT-ID>:function:examplecorp_eao_createimagebuilder",
"ResultPath": "$.type",
"Next": "Resource Created?"
},
"Resource Created?": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.type",
"NumericEquals": -1,
"Next": "Creation Failed"
},
{
"Variable": "$.type",
"NumericEquals": 1,
"Next": "Sleep"
},
{
"Variable": "$.type",
"NumericEquals": 2,
"Next": "Sleep"
}
],
"Default": "Sleep"
},
"Sleep": {
"Type": "Wait",
"Seconds": 300,
"Next": "Get Status"
},
"Get Status": {
"Type": "Task",
"Resource":
"arn:aws:lambda:<REGION-CODE>:<AWS-ACCOUNT-ID>:function:examplecorp_eao_getstatus",
"Next": "Instance Status",
"ResultPath": "$.status"
},
"Instance Status": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.status",
"NumericEquals": -1,
"Next": "Creation Failed"
},
{
"Variable": "$.status",
"NumericEquals": 1,
"Next": "Send StreamingURL"
}
],
"Default": "Sleep"
},
"Send StreamingURL": {
"Type": "Task",
"Resource":
"arn:aws:lambda:<REGION-CODE>:<AWS-ACCOUNT-ID>:function:examplecorp_eao_sendstreamingurl",
"Next": "Split",
"ResultPath": "$.status"
},
"Split": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.type",
"NumericEquals": 1,
"Next": "Wait For Snapshot"
},
{
"Variable": "$.type",
"NumericEquals": 2,
"Next": "1 Hour Timer"
}
],
"Default": "1 Hour Timer"
},
"Wait For Snapshot": {
"Type": "Wait",
"Seconds": 1500,
"Next": "IB Status"
},
"IB Status": {
"Type": "Task",
"Resource":"arn:aws:lambda:<REGION-CODE>:<AWS-ACCOUNT-ID>:function:examplecorp_eao_getstatus",
"ResultPath": "$.status",
"Next": "Snapshotting?"
},
"Snapshotting?": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.status",
"NumericEquals": 2,
"Next": "Get ImageName"
},
{
"Variable": "$.status",
"NumericEquals": 3,
"Next": "Get ImageName"
}
],
"Default": "Wait For Snapshot"
},
"Get ImageName": {
"Type": "Task",
"Resource":"arn:aws:lambda:<REGION-CODE>:<AWS-ACCOUNT-ID>:function:examplecorp_eao_getimagename",
"ResultPath": "$.imagename",
"Next": "Wait For ImageReady"
},
"Wait For ImageReady": {
"Type": "Wait",
"Seconds": 300,
"Next": "Image Status"
},
"Image Status": {
"Type": "Task",
"Resource":"arn:aws:lambda:<REGION-CODE>:<AWS-ACCOUNT-ID>:function:examplecorp_eao_getstatus",
"ResultPath": "$.status",
"Next": "ImageReady?"
},
"ImageReady?": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.status",
"NumericEquals": 3,
"Next": "Create Fleet"
}
],
"Default": "Wait For ImageReady"
},
"Create Fleet": {
"Type": "Task",
"Resource":"arn:aws:lambda:<REGION-CODE>:<AWS-ACCOUNT-ID>:function:examplecorp_eao_createfleet",
"ResultPath": "$.type",
"Next": "Resource Created?"
},
"1 Hour Timer": {
"Type": "Wait",
"Seconds": 3600,
"Next": "StopResources"
},
"Creation Failed": {
"Type": "Fail",
"Cause": "Process Failed",
"Error": "Process Failed"
},
"StopResources": {
"Type": "Task",
"Resource":
"arn:aws:lambda:<REGION-CODE>:<AWS-ACCOUNT-ID>:function:examplecorp_eao_stopresources",
"End": true
}
}
}
6. Reemplace lo que se indica a continuación con sus propios valores:
• Reemplace <AWS-ACCOUNT-ID> con su número de la cuenta de AWS.
• Reemplace <REGION-CODE> con la región de AWS de su elección. El valor debe estar todo en minúsculas.
7. Seleccione
Siguiente.
8. En
Nombre, escriba
examplecorp_eao.
9. En la sección
Permisos, seleccione
Elegir un rol existente.
10. En el menú desplegable
Roles existentes, elija
examplecorp_eao_role, el rol de IAM que creó en el módulo 2.
11. Elija
Crear máquina de estado.
12. En la parte superior de la página, en la sección
Detalles, se muestra el
ARN de la máquina de estado. Tome nota de este ARN. Este ARN se necesita más adelante en el proyecto y tiene el siguiente formato: arn:aws:states:<REGION-CODE>:<AWS_ACCOUNT-ID>:stateMachine:<STATE-MACHINE-NAME>.