0
0

【AWS】起動テンプレートとBatch Compute環境を同時に書くと、起動テンプレートが3つ生成される

Posted at

概要

以前作成したAWS BatchのAutoscalingGroup設定を確認すると「起動設定」になっていました。
今回、これを起動テンプレートにしたところなぜか3つも自動作成されました...色々試したので、記事にします。

前提・Cfnテンプレート

まず、AWS BatchをCloudformationで作成すると、EC2を起動するためにAutoscalingGroupが作成されることを確認しました。なので、そのAutoscalingの設定を起動テンプレートにしてあげればよいのでは?と思い、以下のようにしました。

BatchComputeEnvironmentLaunchTemplateを加えています。
(セキュリティグループやサブネットなどは省いています)

  BatchServiceRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
              - batch.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSBatchServiceRole
      Path: "/"
      RoleName: BatchServiceRole

  BatchComputeEnvironment:
    Type: 'AWS::Batch::ComputeEnvironment'
    Properties:
      Type: MANAGED
      ServiceRole: !GetAtt BatchServiceRole.Arn
      ComputeEnvironmentName: sample-batch-ec2-compute-environment
      ComputeResources:
        Type: EC2
        LaunchTemplate:
            LaunchTemplateName: sample-launch-template
            Version: $Latest
        MinvCpus: !Ref MinvCpus
        DesiredvCpus: !Ref DesiredvCpus
        MaxvCpus: !Ref MaxvCpus
        InstanceTypes:
          - optimal
        InstanceRole: !GetAtt BatchInstanceProfile.Arn
        Subnets:
          - !ImportValue PrivateSubnet
        SecurityGroupIds:
          - !Ref BatchSecurityGroup
        Tags: {"Name": "sample-batch"}
      State: ENABLED

  BatchJobQueue:
    Type: 'AWS::Batch::JobQueue'
    Properties:
      ComputeEnvironmentOrder:
        - ComputeEnvironment: !Ref BatchComputeEnvironment
          Order: 1
      Priority: 1
      State: ENABLED
      JobQueueName: sample-batch-job-queue


  BatchLaunchTemplate:
    Type: 'AWS::EC2::LaunchTemplate'
    Properties:
      LaunchTemplateName: sample-launch-template
      LaunchTemplateData:
        InstanceType: "t3.micro"
        IamInstanceProfile:
          Arn: !GetAtt BatchInstanceProfile.Arn
        KeyName: !Ref KeyPair
        SecurityGroupIds:
          - !Ref BatchSecurityGroup
        TagSpecifications:
          - ResourceType: instance
            Tags:
              - Key: Name
                Value: "sample-batch"

  BatchInstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      Roles:
        - !Ref EcsInstanceRole

上記で実行すると、なぜか起動テンプレートが3つも自動で生成されます。
上記のLaunchTemplateの部分を消すと、生成されるのは2つになりました。

また、試しに管理コンソールからCompute EnvironmentのJSONで指定された起動テンプレートのIDを確認。このIDの起動テンプレートを削除しても、バッチは正常に動作。これで起動テンプレートは1つになりました。
Autoscaling Groupで指定された起動テンプレートのみが残っている状態です。

結論、Compute Environmentを作り替えたら勝手に起動テンプレートになった、というお話...。
なぜかはわかりません。
この現象について調べてみましたが、特に似ている現象の方はいませんでした。

以下アナウンスのようにAWSは以前から、起動テンプレートへの移行を推奨する、と言っているので、これと関係があるかもしれません。私がAWS Batchを作成したのは一年前くらいなので、その時と何か仕様が異なるのかも。

わかったことまとめ

改めてまとめ。

まずはCompute Environmentを作成すれば、自動でAutoscalingGroupとLaunchTemplateが作成されることはわかりました。なので、

  BatchLaunchTemplate:
    Type: 'AWS::EC2::LaunchTemplate'
    ...

というように書いていましたが、これは不要っぽい。
同時に、Compute Environmentで以下のように指定していたのも不要でした。

        LaunchTemplate:
            LaunchTemplateName: sample-launch-template
            Version: $Latest

次に、それでも二つの起動テンプレートが生成されるので、生成後にAutoScalingGroupに紐づいていないほうの起動テンプレートだけ消してあげます。そうすると、テンプレートは一つになりスッキリします。

原因

このようにする必要があるのは、そもそもAWS Batchは「起動設定」をメインに設計されているからなのでしょうか。
AWS Batchは、CPUやメモリに最適化されたコンピューティング環境を用意し、バッチジョブを処理するサービス。つまり、そもそも起動テンプレートを作ってあげる、というようなユーザが任意のEC2を作成するような思想ではないのかも。

とはいえ、ドキュメントには指定できるような書き方がある...よくわからん。

また、なぜか二つ生成される理由の推測ですが、よく見ると一つはインスタンスタイプが入っていて、一つはインスタンスタイプが入っていませんでした。つまりoptimalにすることで、インスタンスタイプを選択していない自由なテンプレートと、指定したcpu/メモリと合致するインスタンスタイプを用意するテンプレートと二つを作成し、より最適なテンプレートを選んでいくという仕組みなのかもしれません。

ということで、以上推測ではあります。何か他にご存知の方がいればぜひ教えてください。

備忘録

ちなみに、Compute EnvironmentLaunchTemplateを同時に作成していたとき、EC2テンプレートのNetworkInterfaces以下にSecurityGroupを参照している一方、Compute EnvironmentでもSecurityGroupを参照していると以下のエラーになりました。

Resource handler returned message: "Error executing request, Exception : Either compute environment Security Groups or Network Interfaces in Launch template are exclusively allowed,

NetworkInterfacesではなくて、ComputeResources直下のSecurityGroupIdsで指定してあげればエラーは無くなります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0