2015-09-21 4 views
3

Я пытаюсь запустить мое «TaskDefinition» в ECS (сервис контейнера Ec2) с помощью SDK PHP.Как запустить задачу ECS на AWS с PHP

  1. Я создал TaskDefinition.
  2. Я создал кластер.
  3. Я создал сервис.

Я думал, что следующий шаг будет «registerContainerInstance», но когда я называю этот метод, у меня есть сообщение об ошибке:

[Aws\Ecs\Exception\EcsException]
Error executing "RegisterContainerInstance" on " https://ecs.eu-west-1.amazonaws.com "; AWS HTTP error: Client error: 400 ClientException (client): An identity document was provided, but not valid. - {" __type":"ClientException","message":"An identity document was provided, but not valid."}

Это потому, что я не посылать «instanceIdentityDocument» и «instanceIdentityDocumentSignature» , Но я не знаю, как получить эти два параметра.

Должен ли я запускать EC2 вручную?

Есть ли другой способ сделать это, я не знаю?

<?php 

namespace App\Http\Controllers; 

use Aws\Ecs\EcsClient; 
use Illuminate\Http\Request; 

use App\Http\Requests; 
use App\Http\Controllers\Controller; 
use Illuminate\Support\Facades\App; 
use Illuminate\Support\Facades\Config; 

class ECSController extends Controller 
{ 
    protected $ecsClient; 

    function __construct() { 
     $config = Config::get('aws'); 
     $this->ecsClient = new EcsClient([ 
      'version'  => 'latest', 
      'region'  => $config['region'], 
      'credentials' => [ 
       'key' => $config['credentials']['key'], 
       'secret' => $config['credentials']['secret'], 
      ], 
     ]); 
    } 

    /** 
    * Display a listing of the resource. 
    * 
    * @return Response 
    */ 
    public function index() 
    { 
/* $response = [ 
       'photos' => [] 
      ];  
     return Response::json($response, $statusCode); */ 
    echo "index\n"; 
    } 

    /** 
    * Show the form for creating a new resource. 
    * 
    * @return Response 
    */ 
    public function create() 
    { 
     $file = file_get_contents('config/configEC2basic.json'); 

     $data = json_decode($file, true /* associative arrays */); 
     $result = $this->ecsClient->registerTaskDefinition($data); 

     if ($result['taskDefinition']['status'] == "ACTIVE") 
     { 
      $taskName = $result['taskDefinition']['containerDefinitions'][0]['name']; 

      if ($result['taskDefinition']['revision'] == 1) 
       echo "Task : '".$taskName."' has been created\n"; 
      else 
       echo "Task : '".$taskName."' has been updated\n"; 
     } 
     else 
      echo "Error : The task is not active.\n"; 

     $clusterName = $this->ecsClient->createCluster([ 
      'clusterName' => 'kaemo', 
     ]); 

     $result = $this->ecsClient->createService([ 
      'desiredCount' => 1, 
      'serviceName' => 'kaedevAWS1', 
      'taskDefinition' => 'testkaeDEV4', 
      'cluster' => 'kaemo' 
     ]); 
    } 

    public function start() 
    { 
     $result = $this->ecsClient->registerContainerInstance([ 
      'cluster' => 'kae', 
      'totalResources' => [ 
       [ 
        'integerValue' => 1, 
        "longValue" => 0, 
        'name' => "CPU", 
        'type' => "INTEGER", 
        "doubleValue" => 0.0, 
       ], 
       [ 
        'integerValue' => 996, 
        "longValue" => 0, 
        'name' => "MEMORY", 
        'type' => "INTEGER", 
        "doubleValue" => 0.0, 
       ], 
       [ 
        'integerValue' => 0, 
        "longValue" => 0, 
        'name' => "PORTS", 
        'type' => "STRINGSET", 
        "doubleValue" => 0.0, 
        "stringSetValue" => [ 
         "80", 
         "22" 
        ] 
       ] 
      ] 
     ]); 

      echo ">".print_r($result, true); 

     /* $result = $this->ecsClient->runTask([ 
      'taskDefinition' => 'testkaemoDEV4', 
      'cluster' => 'kaemo' 
     ]); 

     echo ">".print_r($result, true); */ 
    } 

    /** 
    * Store a newly created resource in storage. 
    * 
    * @param Request $request 
    * @return Response 
    */ 
    public function store(Request $request) 
    { 
     // 
    } 

    /** 
    * Display the specified resource. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function show($id) 
    { 
     // 
    } 

    /** 
    * Show the form for editing the specified resource. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function edit($id) 
    { 
     // 
    } 

    /** 
    * Update the specified resource in storage. 
    * 
    * @param Request $request 
    * @param int $id 
    * @return Response 
    */ 
    public function update(Request $request, $id) 
    { 
     // 
    } 

    /** 
    * Remove the specified resource from storage. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function destroy($id) 
    { 
     // 
    } 
} 

ответ

2

я наконец нашел решение моей проблемы:

Во-первых, вам необходимо создать задачу с "registerTaskDefinition":

$file = file_get_contents('config/configEC2basic.json'); 

     $data = json_decode($file, true /* associative arrays */); 
     $result = $this->ecsClient->registerTaskDefinition($data); 

     if ($result['taskDefinition']['status'] == "ACTIVE") 
     { 
      $taskName = $result['taskDefinition']['containerDefinitions'][0]['name']; 

      if ($result['taskDefinition']['revision'] == 1) 
       echo "Task : '".$taskName."' has been created\n"; 
      else 
       echo "Task : '".$taskName."' has been updated\n"; 
     } 
     else 
      echo "Error : The task is not active.\n"; 

конфигурационный файл/configEC2basic.json:

{ 
    "containerDefinitions": [{ 
     "command": [], 
     "cpu": 1, 
     "entryPoint": ["\/usr\/sbin\/apache2ctl -D FOREGROUND"], 
     "environment": [], 
     "essential": true, 
     "image": "usernamedockerhub\/dockercontainer", 
     "links": [], 
     "memory": 500, 
     "mountPoints": [], 
     "name": "nameTask", 
     "portMappings": [{ 
      "containerPort": 80, 
      "hostPort": 80, 
      "protocol": "tcp" 
     }], 
     "volumesFrom": [] 
    }], 
    "family": "familyTask", 
    "volumes": [] 
} 

Затем вам необходимо создать кластер:

$clusterName = $this->ecsClient->createCluster([ 
      'clusterName' => 'test', 
     ]); 

Затем служба:

$result = $this->ecsClient->createService([ 
      'desiredCount' => 1, 
      'serviceName' => 'serviceName', 
      'taskDefinition' => 'taskName', 
      'cluster' => 'test' 
     ]); 

После этого, вы должны начать свой EC2 экземпляр:

$result = $this->ec2Client->runInstances([ 
      'ImageId'  => 'ami-2aaef35d', 
      'MinCount'  => 1, 
      'MaxCount'  => 1, 
      'InstanceType' => 't2.micro', 
      'UserData'  => base64_encode("#!/bin/bash \r\n echo ECS_CLUSTER=test >> /etc/ecs/ecs.config"), 
      'IamInstanceProfile' => [ 
       'Arn' => 'ARNEC2' 
      ], 

     ]); 

Когда EC2 готов, вы можете начать свою задачу:

$result = $this->ecsClient->runTask([ 
      'taskDefinition' => 'taskName', 
      'cluster' => 'test' 
     ]); 

 Смежные вопросы

  • Нет связанных вопросов^_^