お知らせ
過去に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)
環境変数で渡したバケットに固定文字列のファイルを出力するだけです。
試した環境は
- Windows環境で実行
- Docker環境で実行
- Fargate環境で実行(1回だけ実行)
- 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.txt
とDockerfile
を用意し、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で動作するところまでできました。