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 )