DataPipelineを使ってdockerコンテナを定期実行してみる

# やること

cronでジョブを実行するのと同じような感じで、DataPipelineを使ってdockerコンテナを定期実行するようにしてみる。
ジョブを定時実行するパイプラインがさくっと出来上がるようなCloudFormationのテンプレートを作る。

# 用意するもの

- [TaskDefinition](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html)

Docker Imageの実行定義

- [ECS Cluster](http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_clusters.html)

TaskDefinitionをrunするためのクラスター

# CloudFormation　Template

CloudFormationパラメータ

| パラメータ名              |                      |
|:-----------------------|:---------------------|
| EcsClusterName         | タスクを実行するクラスタ名 |
| EcsTaskDefinitioinArn  | クラスタ上で実行するタスク |

30分ごとにDataPipelineがEC2インスタンスを立ち上げaws-cliの`ecs run-task`コマンドでTaskDefinitionを実行しています。

~~~　yaml
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EcsClusterName:
    Type: String
    Description: Enter ECS Cluster Name to run docker.
  EcsTaskDefinitioinArn:
    Type: String
    Description: Enter TaskDefinitionArn to run.
Resources:
  EcsRunTaskSample:
    Type: 'AWS::DataPipeline::Pipeline'
    Properties:
      Name: ecs-run-task-sample
      Description: "Pipeline to run task on ECS"
      Activate: true
      ParameterObjects:
        - 
          Id: "myAWSCLICmd"
          Attributes: 
            - 
              Key: "description"
              StringValue: "command to execute"
            - 
              Key: "type"
              StringValue: "String"
      ParameterValues:
        - 
          Id: "myAWSCLICmd"
          StringValue:
            Fn::Join:
              - ""
              - - "AWS_DEFAULT_REGION="
                - Ref: AWS::Region
                - " aws ecs run-task --cluster "
                - Ref: EcsClusterName
                - " --task-definition "
                - Ref: EcsTaskDefinitioinArn
      PipelineObjects:
        - 
          Id: "Default"
          Name: "Default"
          Fields: 
            - 
              Key: "type"
              StringValue: "Default"
            - 
              Key: "failureAndRerunMode"
              StringValue: "CASCADE"
            - 
              Key: "role"
              StringValue: "DataPipelineDefaultRole"
            - 
              Key: "schedule"
              RefValue: "DefaultSchedule"
            - 
              Key: "resourceRole"
              StringValue: "DataPipelineDefaultResourceRole"
            - 
              Key: "scheduleType"
              StringValue: "cron"
        - 
          Id: "DefaultSchedule"
          Name: "Every 30 minutes"
          Fields: 
            - 
              Key: "parent"
              RefValue: "Default"
            - 
              Key: "type"
              StringValue: "Schedule"
            - 
              Key: "period"
              StringValue: "30 Minutes"
            - 
              Key: "startAt"
              StringValue: "FIRST_ACTIVATION_DATE_TIME"
        - 
          Id: "Ec2Instance"
          Name: "Ec2Instance"
          Fields: 
            - 
              Key: "parent"
              RefValue: "Default"
            - 
              Key: "type"
              StringValue: "Ec2Resource"
            - 
              Key: "instanceType"
              StringValue: "t2.micro"
            - 
              Key: "terminateAfter"
              StringValue: "10 Minutes"
        - 
          Id: "CliActivity"
          Name: "CliActivity"
          Fields: 
            - 
              Key: "parent"
              RefValue: "Default"
            - 
              Key: "type"
              StringValue: "ShellCommandActivity"
            - 
              Key: "runsOn"
              RefValue: "Ec2Instance"
            - 
              Key: "command"
              StringValue: "(sudo yum -y update aws-cli) && (#{myAWSCLICmd})"
~~~

## ParameterObjects&ParameterValues

[DataPipeline用のParameter](http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-custom-templates.html)が使えるようなので宣言する。（変数は`my`で始めなきゃいけないという決まりがある）
`myAWSCLICmd`を宣言して`CliActivity`で実行するコマンドとして使う。

## PipelineObjects

実際に実行するパイプラインの内容。

| パイプラインオブジェクトの種類 | type | やってること |
|:-----------|:------------|--------------|
| [Schedule](http://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/dp-object-schedule.html)       | Schedule | 30分毎にActivityを実行する |
| [Resource](http://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/dp-object-ec2resource.html)       | Ec2Resource | `t2.micro`インスタンスを用意する。 |
| [Activity](http://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/dp-object-shellcommandactivity.html)       | ShellCommandActivity | aws-cliの`aws run-task`でECSクラスター上にタスクを走らせる。 |