public note

AWS Batch のシークレットを AWS Secrets Manager から取得する

AWS Batch で使うシークレットを AWS Secrets Manager から取得したのでメモ。 設定は、前回の Step Functions → BatchAWS Cloud Formation テンプレートに追加して、動作を確認しています。

GitHub - tosh223/practice-aws-batch: Sample code of AWS Batch on AWS Fargate

Users Guide

詳しい設定方法はこちらにあります。

docs.aws.amazon.com

Secrets Manager

シークレット登録

事前に、以下のシークレットを登録しました。

  • Secret ARN: arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:${your-secret-name}
  • Secret Key: testkey
  • Secret Value: testvalue

Cloud Formation

AWS::Batch::JobDefinition

batch-from-step-functions/template.yaml から、AWS::Batch::JobDefinition*1 を抜粋します。 一番下のSecretsがシークレットの設定です。

batch-from-step-functions/template.yaml#L116-L118

 BatchJobDefinition:
    Type: 'AWS::Batch::JobDefinition'
    Properties:
      Type: container
      PlatformCapabilities:
        - FARGATE
      ContainerProperties:
        ExecutionRoleArn: !GetAtt BatchExecutionRole.Arn
(中略)
        Secrets:
          - Name: SECRET_TEST
            ValueFrom: !Sub "${your-secret-ARN}:testkey::"

ValueFrom の設定値ですが、Secret ARN をそのまま指定すると Plaintext(JSON) が環境変数 SECRET_TEST にセットされます。

{
  "testkey": "testvalue"
}

Valueだけがほしい場合はこれだと一手間かかるので、末尾に:testkey::のように設定します。こうするとtestvalueだけが環境変数にセットされます。 また、Key指定をする場合は、Sub関数に指定している値を二重引用符でくくらないと構文エラーになります。

AWS::IAM::Role

同じファイルに、ジョブコンテナへ設定するIAM Roleを定義しており、その中に Secrets Manager からシークレットを取得する権限を付与しています。

batch-from-step-functions/template.yaml#L122-L146

  BatchExecutionRole:
    Type: AWS::IAM::Role
    Properties:
(中略)
      Policies:
        - PolicyName: secretmanager
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - secretsmanager:GetSecretValue
                Resource:
                  - !Sub "${your-secret-ARN}"

AWS::EC2::VPCEndpoint

以上でシークレットの設定は終わりなのですが、ネットワーク構成によっては VPC Endpoint が必要です。

AWS Batch のジョブコンテナは VPC Subnet の中で実行されますが、多くの場合 Private Subnet を指定すると思われます。NAT Gateway や NAT Instance があれば、それを経由して Secrets Manager に接続しますので、上記の設定でOKです。パブリックネットワークに出られない・出たくない場合には、追加で VPC Endpoint を設定します。

vpc-for-aws-batch/template.yaml#L297-L307

  SecretManagerEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub com.amazonaws.${AWS::Region}.secretsmanager
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      VpcId: !Ref VPC
      SubnetIds:
        - !Ref PrivateSubnet
      SecurityGroupIds:
        - !Ref EndpointSecurityGroup