App-FargateStack

 view release on metacpan or  search on metacpan

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

package App::FargateStack::Builder::Secrets;

use strict;
use warnings;

use App::FargateStack::Builder::Utils qw(log_die);
use App::FargateStack::Constants;
use App::SecretsManager;
use Carp;
use Data::Dumper;
use English qw(-no_match_vars);
use File::Basename qw(basename);

use Role::Tiny;

########################################################################
sub add_secrets {
########################################################################
  my ( $self, $task ) = @_;

  return
    if !$task->{secrets};

  require App::SecretsManager;

  my $secrets_manager = App::SecretsManager->new( $self->get_global_options );

  my @secrets;

  foreach my $secret ( @{ $task->{secrets} } ) {
    my ( $path, $env_name, $secret_arn );

    if ( !$self->get_cache || !ref $secret ) {
      ($secret) = ref $secret ? keys %{$secret} : $secret;

      ( $path, $env_name ) = split /:/xsm, $secret;

      my $secret_name = basename($path);
      $env_name = uc( defined $env_name ? $env_name : $secret_name );

      $secret_arn = $secrets_manager->find_secret_arn($path);

      log_die( $self, 'Secret not found in Secrets Manager: %s (env var: %s)', $path, $env_name )
        if !$secret_arn;
    }
    else {
      ( $secret, $secret_arn ) = %{$secret};
      ( $path, $env_name ) = split /:/xsm, $secret;
    }

    log_die( $self, 'secret value must be path:env-name, not %s, example: /mysql/password:DB_PASSWORD', $secret )
      if !$env_name || !$path;

    push @secrets, { name => $env_name, valueFrom => $secret_arn };
  }

  $self->set_secrets( \@secrets );  # adding new secrets should
                                    # trigger updating policy
  return \@secrets;
}

########################################################################
sub add_secrets_policy {
########################################################################
  my ( $self, $secrets ) = @_;

  return if !$secrets || !@{$secrets};

  my @secret_arns = map { $_->{valueFrom} } @{$secrets};

  return {
    'Effect'   => 'Allow',
    'Action'   => 'secretsmanager:GetSecretValue',
    'Resource' => \@secret_arns,
  };
}

1;



( run in 3.216 seconds using v1.01-cache-2.11-cpan-2398b32b56e )