App-FargateStack

 view release on metacpan or  search on metacpan

lib/App/FargateStack/Builder/TaskDefinition.pm  view on Meta::CPAN

  return ( $cpu, $memory, $size )
    if defined $size && defined $cpu && defined $memory;

  if ( defined $cpu && defined $memory ) {
    ($size) = grep { $ECS_TASK_PROFILES{$_}->{cpu} eq $cpu && $ECS_TASK_PROFILES{$_}->{memory} eq $memory }
      keys %ECS_TASK_PROFILES;

    if ($size) {
      $task->{size} = $size;
    }

    return ( $cpu, $memory, $size );
  }

  my $logical_type = choose {
    return 'web'    if $type =~ /http/xsm;
    return 'daemon' if $type eq 'daemon';
    return 'job'    if $type eq 'task' && $task->{schedule};
    return 'task';
  };

  $size //= $ECS_TASK_PROFILE_TYPES{$logical_type};

  if ($size) {
    my $profile = $ECS_TASK_PROFILES{$size};

    croak sprintf "ERROR: unknown profile: [%s], valid profiles: [%s]\n", $size, join q{,}, keys %ECS_TASK_PROFILES
      if !$profile;

    $cpu    //= $profile->{cpu};
    $memory //= $profile->{memory};
  }

  return ( $cpu, $memory, $size );
}

########################################################################
sub create_taskdef_files {
########################################################################
  my ($self) = @_;

  my ( $config, $services ) = $self->common_args(qw(config tasks));

  foreach my $task_name ( keys %{$services} ) {
    my $task = $services->{$task_name};

    $task->{type} //= 'task';

    my $type = $task->{type};

    # -- port mappings --
    my $portMapping = define_port_mapping( $task, $type );

    if ($portMapping) {
      @{$task}{qw(container_port host_port)} = @{ $portMapping->[0] }{qw(containerPort hostPort)};
    }

    # -- log group/stream prefix --
    #
    # Note: the default log group name was set earlier...and task will
    # be updated when (and if) we create the log group...
    my $log_group = $config->{log_group}->{name};

    my $stream_prefix = $config->{app}->{name};

    # -- image name --
    my $image = $self->resolve_image_name( $task->{image} );

    # -- environment --
    my @environment
      = map { { name => $_, value => $task->{environment}->{$_} } } keys %{ $task->{environment} // {} };

    # -- task name/family  --
    my ( $name, $family ) = @{$task}{qw(name family)};
    $task->{name}   //= $task_name;
    $task->{family} //= $task_name;

    # -- task size --
    my ( $cpu, $memory, $size ) = define_task_size( $task, $type );
    $task->{size}   //= $size;
    $task->{memory} //= $memory // $DEFAULT_MEMORY_SIZE;
    $task->{cpu}    //= $cpu    // $DEFAULT_CPU_SIZE;

    # -- secrets (from App::Fargate::Builder::Secrets)
    my $secrets = $self->add_secrets($task) // [];

    # -- efs mounts --
    my ( $volumes, $mount_points ) = $self->add_volumes($task);

    my $role_name      = $config->{role}->{name}      // $self->create_default( 'role-name', 'ecs' );
    my $task_role_name = $config->{task_role}->{name} // $self->create_default( 'role-name', 'task' );

    # Note that we create the role ARNs rather than taking them from
    # the config. This is because we create the task definition before
    # we actually create the roles. The role ARN is determistic...so
    # why not?

    my $taskdef = {
      executionRoleArn     => $self->create_role_arn($role_name),
      taskRoleArn          => $self->create_role_arn($task_role_name),
      memory               => "$task->{memory}",
      containerDefinitions => [
        { logConfiguration => {
            options => {
              'awslogs-region'        => $config->{region},
              'awslogs-stream-prefix' => $stream_prefix,
              'awslogs-group'         => $log_group
            },
            logDriver => q{awslogs}
          },
          environment  => \@environment,
          secrets      => $secrets,
          portMappings => $portMapping // [],
          essential    => JSON::true,
          name         => $task->{name},
          $task->{command} ? ( command => [ $task->{command} ] ) : (),
          image       => $image,
          mountPoints => $mount_points // [],
        }
      ],
      cpu                     => "$task->{cpu}",



( run in 0.529 second using v1.01-cache-2.11-cpan-e1769b4cff6 )