ゴール
下記で作成したECS環境へのデプロイをcodepipeline化する
https://qiita.com/chanP_yamazaki/items/1760a952c4da8d3fde19
S3にソースファイルを作成
imagedefinitions.json
[{"name":"php-fpm","imageUri":"アカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/ECRリポジトリ名:php-fpm"}]
バージョニング設定を有効にしたS3バケットを作成後
上記ファイルを作成し、zip化してからアップロードする
codepipelineを作成
ステップ | 名称 | 設定値 |
---|---|---|
ステップ1 | パイプライン名 | test |
ステップ2 | ソースプロバイダ | Amazon ECR |
リポジトリ名 | test | |
画像タグ | php-fpm | |
ステップ3 | ビルドステージをスキップ | |
ステップ4 | デプロイプロバイダ | Amazon ECS |
クラスター名 | test-cluster | |
サービス名 | 作成済みのものを指定 |
codepipelineを編集
作成後にステージの調整をしたいので編集を実行
SourceステージでS3を追加
名称 | 設定値 |
---|---|
アクション名 | s3 |
アクションプロバイダー | Amazon S3 |
バケット | ソースファイルを置いたバケットを指定 |
S3 オブジェクトキー | imagedefinitions.json.zip |
出力アーティファクト | s3 |
Deployステージで編集
名称 | 設定値 |
---|---|
入力アーティファクト | SourceArtifact → s3 |
イメージ定義ファイル | imagedefinitions.json |
デプロイ開始/終了通知用のlambda関数用意
ランタイム: python
import json
import urllib.request
def post_slack(message):
send_data = {
"text": message,
}
send_text = json.dumps(send_data)
request = urllib.request.Request(
'webhookURL',
data = send_text.encode('utf-8'),
method = "POST"
)
with urllib.request.urlopen(request) as response:
response_body = response.read().decode('utf-8')
def lambda_handler(event, context):
snsMessageObject = json.loads(event['Records'][0]['Sns']['Message'])
state = snsMessageObject['detail']['state']
if state == 'STARTED':
message = 'コンテナデプロイ開始します'
elif state == 'SUCCEEDED':
message = 'コンテナデプロイ終了しました'
elif state == 'FAILED':
message = 'コンテナデプロイに失敗しました。'
else:
message = event['Records'][0]['Sns']['Message']
post_slack(message)
パイプラインの通知ルールを作成
名称 | 設定値 |
---|---|
通知をトリガーするイベント | Pipeline execution - Failed/Started/Succeeded |
ターゲット | 「ターゲットの作成」を押下して作成。作成後に「ターゲットの選択」は自動入力される |
SNSトピックの編集
先ほど作成したトピックのサブスクリプション作成
名称 | 設定値 |
---|---|
プロトコル | Amazon Lambda |
エンドポイント | 通知用に作成したlambda関数 |
デプロイ実施
codepipelineの「変更のリリース」もしくはECRへのイメージpushでデプロイが開始し、開始と終了タイミングで通知が来れば成功
追加
ECRへのpushでデプロイを発火させずに承認アクションを追加することも可能
https://qiita.com/yukinosuke/items/17bcdae3fe4512e22eea