cfn = new CloudFormationClient([ 'version' => 'latest', 'region' => $region ?? env('AWS_REGION'), 'profile' => $profile ?? env('AWS_PROFILE') ]); } public function getStack(string $stack): ?Stack { try { $stack_description = $this->cfn->describeStacks([ 'StackName' => $stack ]); } catch (\Aws\Exception\AwsException $ex) { if ($ex->getAwsErrorMessage() == 'Stack with id '.$stack.' does not exist') { return null; } throw new \Exception($ex->getAwsErrorMessage(), $ex->getAwsErrorCode()); } return new Stack($stack_description['Stacks'][0]); } public function createStack(string $stack_name, string $template_body, array $parameters = []): Stack { $response = $this->cfn->createStack($this->buildStackRequest($stack_name, $template_body, $parameters)); return $this->getStack($response['StackId']); } public function updateStack(string $stack_name, string $template_body, array $parameters = []): Stack { $response = $this->cfn->updateStack($this->buildStackRequest($stack_name, $template_body, $parameters)); return $this->getStack($response['StackId']); } protected function buildStackRequest(string $stack_name, string $template_body, array $parameters = []): array { $request = [ 'StackName' => $stack_name, 'TemplateBody' => $template_body, 'Capabilities' => ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'], 'TimeoutInMinutes' => 5 ]; if (sizeof($parameters)) { $request['Parameters'] = []; foreach ($parameters as $k => $v) { $request['Parameters'][] = [ 'ParameterKey' => $k, 'ParameterValue' => $v ]; } } return $request; } }