Fargateでスタンドアロンタスクを動かす

# はじめに
Fargateでタスクを動かす例を探していましたが、ほとんどWebサービスの例でしたので、自分で調べて記事にしました。

# 概要

- 文字列をPrintするだけのタスクを動かします
    - CloudWatch Logsに出力されます
- Dockerコンテナを作り、ECRにPUSHして、それを実行します
    - 使うベースのイメージはUbuntu
        - AWS提供イメージではないです
        - Pythonをインストールするところからです
- ECSはコンソールから作っていきます
    - 作成するのはクラスターとタスクになります
- 実行VPCは、デフォルトVPCを使います

# やってみた

## 環境

Cloud9で、t2.microを用いてます。

## コンテナ作成
Cloud9上で、コマンドで作っていきます。

```bash
# プロジェクトディレクトリ作成
mkdir sample-fargate-task && cd sample-fargate-task

# リージョンとアカウントIDを環境変数にセット
REGION="ap-northeast-1"
ACCOUNTID=$(aws sts get-caller-identity --output text --query Account)
IMAGENAME="test-task1"

touch app.py
touch Dockerfile
```

```python:app.py
def handler(event, context):
  print("hogehoge")
    
if __name__ == "__main__":
  handler(None,None)
```

```Dockerfile:Dockerfile
FROM ubuntu:20.04

RUN apt-get update && apt-get install -y python3-pip
  
COPY app.py /function/

WORKDIR /function

ENTRYPOINT [ "/usr/bin/python3" ]

CMD [ "app.py" ]
```

Buildして、試しに動かしてみます。
```bash
docker build -t ${IMAGENAME} .
docker run ${IMAGENAME}
```

## ECRにPUSH
作ったコンテナをECRにPUSHします。

まずECRを作るCFnです。

```bash
# ECRリポジトリ作成CFn
touch createECRRepository.yaml
```

```yaml:createECRRepository.yaml
AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  RepositoryName:
    Type: String

Resources:
  TestEcrPoc:
    Type: AWS::ECR::Repository
    Properties:
      RepositoryName: !Ref RepositoryName

Outputs:    
  Task1RepositoryUri:
    Value: !GetAtt TestEcrPoc.RepositoryUri
```
ECRを作って、PUSHします。

```bash
# ECRにレポジトリ作成
REPSTACKNAME="create-ecrrepo-task1"
REPOSITORYNAME="test-task1-ecs"
aws cloudformation create-stack --stack-name ${REPSTACKNAME} \
  --template-body file://createECRRepository.yaml \
  --region ${REGION} \
  --parameters \
    ParameterKey=RepositoryName,ParameterValue=${REPOSITORYNAME}

# イメージにタグ付与
TAGNAME=`aws cloudformation describe-stacks --stack-name ${REPSTACKNAME} --query "Stacks[].Outputs[?OutputKey=='Task1RepositoryUri'].[OutputValue]"  --output text`:latest
docker tag ${IMAGENAME}:latest ${TAGNAME}

# 認証
aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin ${ACCOUNTID}.dkr.ecr.${REGION}.amazonaws.com

# 作ったイメージをPUSH
docker push ${TAGNAME}
```


## ECSでタスク実行
ここからはコンソールを操作します。

### クラスタ作成
ECSの画面で、クラスターの作成を行います。設定はFargateにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f9c83d84-0c52-4df6-c901-9aec94280c0d.png)


### タスク定義
次はタスク定義をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/10dac62c-ec53-53fb-2ea0-9222b006dc2b.png)


インフラ定義で、小さいCPUとメモリにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8bb47455-882f-5a4f-63a9-77f406e08a4e.png)

ロールをあてがいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/5ed09b60-6ff9-8b77-d931-8c5b090fe223.png)

`ecsTaskExecutionRole`がない場合、以下のようなロールが自動で作られます。

- ポリシー：AmazonECSTaskExecutionRolePolicy
- 信頼関係：ecs-tasks.amazonaws.com

コンテナの指定をします。
イメージURIは`echo ${TAGNAME}`の値をセットします。
また、ポートマッピングは削除しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ff15c967-c07c-d4ba-73a9-94543797a8c8.png)



以下の設定に変更はしていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a33fccc6-3cc4-5be9-b3d9-a1cd6180c89d.png)

ログは出すようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c506f55c-59ea-2934-cc2b-6f496cf5dc68.png)

後はそのまま、作成します。

### タスクの実行

タスク定義から作成したタスクを選択し、タスクの実行をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/970391a8-cd66-0a3a-cc5d-8d7c114b6e39.png)

動かすクラスターを選択します。コンピューティング設定は起動タイプにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/31b24eff-d0a7-70cf-0588-787a623efc47.png)

他のはそのまま設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d3cedbcd-ed63-46b5-03b6-7524d2581829.png)

クラスターの画面で、現在の状況がわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f1774225-7426-790a-32db-e451f61d8496.png)

実行が完了すると、タスクから消えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2e06baa7-c028-fdbc-3824-2fdaf2b722b8.png)


CloudWatch Logsに出ていますので、確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9a22a646-fc32-f174-d930-e4e7b8bf61f5.png)

printで指定した文字列が出ていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/aacc6d89-c463-c588-9ee3-220864676303.png)

# おわりに

今回はタスクを動かすFargateの例を記事にしました。
クラスターとタスクだけでできる例ですので、ちょっと触ってみたいという方はお試しください。

この記事がどなたかのお役に立てれば幸いです。