AWS Batch のシークレットを AWS Secrets Manager から取得する
AWS Batch で使うシークレットを AWS Secrets Manager から取得したのでメモ。 設定は、前回の Step Functions → Batchの AWS Cloud Formation テンプレートに追加して、動作を確認しています。
GitHub - tosh223/practice-aws-batch: Sample code of AWS Batch on AWS Fargate
Users Guide
詳しい設定方法はこちらにあります。
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