質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

CI(継続的インテグレーション)

CI(継続的インテグレーション)は、アプリ開発においてビルドとテストを繰り返すことで品質改善と納期短縮を図る手法です。JenkinsやTravis CIなどの専用ツールを利用してプロセスを自動化・半自動化して効率的に実施します。

Q&A

解決済

1回答

1761閲覧

CloudWatch EventsとCodeシリーズを使ったCI/CD構成について

pond

総合スコア350

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

CI(継続的インテグレーション)

CI(継続的インテグレーション)は、アプリ開発においてビルドとテストを繰り返すことで品質改善と納期短縮を図る手法です。JenkinsやTravis CIなどの専用ツールを利用してプロセスを自動化・半自動化して効率的に実施します。

0グッド

0クリップ

投稿2021/04/22 01:07

前提・実現したいこと

AWSのCloudWatch EventsとCodeシリーズを使って下図のCI/CD構成を実現したい

イメージ説明

要件

① 日時を指定して、もしくは即時に静的コンテンツを本番サーバへアップロード・削除したい、動的コンテンツはありません
② 日時の設定、コンテンツのデプロイルールの設定は顧客側にやってもらう
日時の設定:CloudWatch EventsのCron式で設定
デプロイルールの設定:appspec.ymlで設定

確認したいこと

① そもそも、この構成の実現が可能か?
というのも、CodeCommitへpushした時と同時にcodepipelineが動いてしまい即時コンテンツをアップしてしまいそう
開発環境は即時反映でもいいが、本番は公開するタイミングがあるので指定した日時にCodePipelineが動くようにしたい
② ファイルを削除する時は?
appspec.ymlのhooksでファイルを削除するシェルを動かす形になるのか?
③ ファイルを即時にアップロード・削除する時にCloudWatch EventsのCron式で
1分後とか近い時間を指定する以外に何か方法はあるか

補足情報(FW/ツールのバージョンなど)

・WEBサーバ:Amazon EC2
・コンテンツ種類:静的コンテンツ
・コンテンツ配置:CodeDeoloy
・ソース管理:CodeCommit
・トリガー:CloudWatch Events
・その他:開発・本番のAWSアカウントが分かれている

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Cron式でCloudWatch Eventを指定すると定期実行になるので、「任意の時刻に実行する」というユースケースには向いていません。

① そもそも、この構成の実現が可能か?

可能ですが、改善の余地があると思います。

CodeCommitへpushした時と同時にcodepipelineが動いてしまい即時コンテンツをアップしてしまいそう

CodePipelineの設定次第です。
CodePipelineでは手動で承認するプロセスを追加することができます。
CodePipeline でパイプラインに手動の承認アクションを追加する

ただ、これは「承認」というプロセスでデプロイするか否かをコントロールすることになるので、「任意の時刻にデプロイを行いたい」みたいなユースケースに向いているかはわかりません。

この辺の設計には個人的にも頭を悩ませているところなのですが、デプロイのタイミングをある程度コントロールしたい場合はCodePipelineはあまり使わないほうがいいと思っています。
自分がやるのはCodeBuildでのビルドまでは自動化しておいてS3にビルドの成果物を配置しておき、CodeDeployを任意のタイミングで手動実行することによってデプロイする、みたいなプロセスです。
あと、IAMユーザを持ってない人がどうやってデプロイするかが課題です。キーを発行してcliでやってもらうにしてもキーの権限管理を適切に行う必要がありますし。
いっそのことJenkinsサーバを立ててそこからCodeDeployを走らせてもらうとかしたほうが楽かもしれません。

もしビルドのいらない静的コンテンツであれば、そもそもCodePipelineなんて大げさなものを使わずとも、CodeDeployを使ってリポジトリからそのままデプロイする、でも十分だと思います。

あと、余談ですがCodeDeployが動くのは実際にはサーバの中なので、図の位置とはちょっと違います。

② ファイルを削除する時は?

appspec.ymlのhooksでファイルを削除するシェルを動かす形になるのか?

これはそうなります。CodeDeployがデフォルトでやってくれるのはソースを配置元(S3なりGitリポジトリなり)から配置先にダウンロードする処理です。
配置後になにか処理をしたい場合はhookスクリプトでやってください。

③ ファイルを即時にアップロード・削除する時にCloudWatch EventsのCron式で

1分後とか近い時間を指定する以外に何か方法はあるか

これはそもそも前述の通りCloudWatch Eventを使うケースではないと思います。

投稿2021/04/22 08:26

yu_1985

総合スコア7427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pond

2021/04/22 10:21 編集

いつもありがとうございます。難しいですね。。 確かにCodeDeployはサーバにエージェントをインストールするのでサーバの中で 動いていますね。失礼いたしました。 > もしビルドのいらない静的コンテンツであれば、そもそもCodePipelineなんて > 大げさなものを使わずとも、CodeDeployを使ってリポジトリからそのままデプロイするでも十分だと思います cloudwatch eventsのターゲットとしてpipelineかbuildしか選べず、pipelineで構成するしかないかと 思いました。CodeDeployを使ってリポジトリからそのままデプロイする方法ですが、参考になる記事が ありましたら共有頂けないでしょうか。日時指定はCRONでやるしかないですかね。
yu_1985

2021/04/22 10:55

いえ、ですのでCloudWatch Eventを使う必要がないのでは?と思います。 CLIかなんかで手動実行すればいいのではないでしょうか。 今確認したら、リポジトリから直接…とできるのはGitHubを使っている場合のみですね。 そうなるとCodeBuildでS3に配置して、任意のタイミングでCodeDeployを使ってS3配置済みのソースをデプロイすればいいと思います。 なのでCodePipelineを使うならCodeBuildのところまででいいんじゃないでしょうか。 CodeDeployのやり方は、まずチュートリアルで流れを掴んでみてください。 機械翻訳でめちゃくちゃ読みづらいですが。 https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorials-wordpress.html 何度もいいますが、cronそれ自体は定期実行のためのものです。 日時指定のためのものだと思わないほうがいいです。 仮にやるならデプロイ予定時刻をどこかに持っておいて1分ごととかにデプロイ予定時刻をチェックし、現在時刻以降だったらデプロイを実行する、みたいな仕組みを作ればできなくもないですが。 ただ、デプロイのタイミングでデプロイ結果を自分たちでどうせ確認するなら手動でCodeDeployを動かすでもいいのではないかと思います。
pond

2021/04/22 11:30

なるほど。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問