メインコンテンツまでスキップ

S3にPutObjectするPythonプログラムをFargateに乗せるまでの道のり

· 約5分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

簡単なPythonプログラムをFargateで実行するまでの道のりです。

app.py
import os

import boto3

bucket = os.getenv('BUCKET_NAME', '')
key = 'HelloWorld.txt'
body = 'Hello, World!'

s3 = boto3.client('s3')
s3.put_object(Bucket=bucket, Key=key, Body=body)

環境変数で渡したバケットに固定文字列のファイルを出力するだけです。

試した環境は

  1. Windows環境で実行
  2. Docker環境で実行
  3. Fargate環境で実行(1回だけ実行)
  4. Fargate環境で実行(定期実行)

7/7 更新 S3エンドポイントは不要でしたので記述を削除しました。


Windows環境で実行

環境

  • Windows 10
  • Python 3.6

Python仮想環境の作成

python -m venv .venv
.venv\Scripts\activate

ライブラリーの取得

pip install boto3 awscli

AWS CLIの設定(認証情報の設定)

aws configure
AWS Access Key ID [None]: [アクセスキー]
AWS Secret Access Key [None]: [シークレットアクセスキー]
Default region name [None]: [ap-northeast-1などのリージョン]
Default output format [None]:

バケット名の指定(環境変数)

バケット名は環境変数から取得するようにしたので、環境変数にバケット名をセットします

set BUCKET_NAME=[バケット名]

実行!

python -m app

無事、S3にファイルが出力されました。

Docker環境で実行

ファイルの用意

requirements.txtDockerfileを用意し、app.pyと同じフォルダーに格納します。

requirements.txt
boto3==1.9.183
Dockerfile
FROM python:alpine

WORKDIR /app
ADD . /app

RUN python3 -m pip install -r requirements.txt
CMD ["python3", "-m", "app"]

Dockerイメージのビルド

docker build -t [Dockerイメージのタグ名] .

実行!!

コンテナ内にはAWSの認証情報がないので、環境変数で渡します。バケット名も同様です。

docker run -e AWS_ACCESS_KEY_ID=[アクセスキー] -e AWS_SECRET_ACCESS_KEY=[シークレットアクセスキー] -e BUCKET_NAME=[バケット名] [Dockerイメージのタグ名]

無事、S3にファイルが出力されました。

Fargate環境で実行の準備

準備1:ECRへの登録

Fargateで実行するため、DockerイメージをECR(Elastic Container Registry)に登録します。

リポジトリの作成

aws ecr create-repository --repository-name [リポジトリ名]

docker loginコマンドの取得と実行

aws ecr get-login --no-include-email

コンソールに出力されるコマンドを実行します。

リモートリポジトリに登録するローカルDockerイメージを指定する

docker image tag [ローカルのDockerイメージのタグ名] [リポジトリ名]:[リモートのDockerイメージ名]

Dockerイメージをリポジトリにプッシュする

docker image push [リポジトリ名]:[リモートのDockerイメージ名]

準備2:ECSのクラスターの作成

マネジメントコンソールでECSの画面を表示。クラスターを作成する。

設定項目設定内容
クラスターテンプレートの選択ネットワーキングのみ
クラスターの設定このクラスター用の新しいVPCを作る

準備3:ECSのタスク定義の作成

マネジメントコンソールでECSの画面を表示。タスク定義を作成する。

設定項目設定内容
起動タイプの互換性の選択FARGATE
タスクとコンテナの定義の設定↓↓↓
タスク実行ロールAmazonECSTaskExecutionRolePolicyの他にS3へのPutObject権限も必要
コンテナの定義↓↓↓
イメージECRのイメージ URI(マネジメントコンソールで確認する)
環境変数BUCKET_NAMEにバケット名を指定

Fargate環境で実行(1回だけ実行)

タスク定義から作成したものを選び、アクションタスクの実行を行います。

設定項目設定内容
起動タイプFARGATE
クラスター作成したもの
タスクの数1
VPC作成したもの

実行!!!

ウィザードの最後のタスクの実行を押すと、実行されます。

Fargate環境で実行(定期実行)

クラスターから作成したものを選び、画面下のタブにあるタスクのスケジューリングの先の作成を選びます。

設定項目設定内容
スケジュールルールタイプお好みで
起動タイプFARGATE
タスク定義作成したもの
タスクの数1
クラスター VPC作成したもの

実行!!!!

ウィザードの最後の作成を押すと、指定したスケジュールに従って実行されます。 固定された間隔で実行の場合、初回起動は作成を押してから固定された間隔が経過したあとになるようです。

まとめ

後半がかなり手抜きになりましたが、一応Fargateで動作するところまでできました。

参考サイト

AWS ECS/Fargate 操作覚え書き