目次
・趣旨目標
・参考サイト
・使用するサービス
・勝手なイメージ
・ハンズオン
・リソースの削除
・さいごに
趣旨目標
ハンズオンを通じて基礎知識を身に付ける!Code群のサービスが少し謎なので理解!
参考サイト
使用するサービス
CodeCommit, AWS CodeBuild, AWS CodeDeploy, AWS CodePipeline
勝手なイメージ
ハンズオンする前は、GitHubとの違いを理解するのに最初は苦しみました。
ハンズオン
S3を使ったCI/CD環境を構築
・リージョンをチェック
・S3作成
静的webサイトホスティングとして使用するので、赤枠のチェックを外しちゃいます。
プロパティから、静的webサイトホスティングの編集で、有効に設定します。
「index.html」を指定しておきます。
アクセス許可のタブから、バケットポリシーを編集していきます。
次のポリシーは、S3のオブジェクトを読み取りすることができる設定とするものです。なお、Resourceの箇所はバケット名を入れます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::xxxxxxxxx/*"
]
}
]
}
オブジェクトをアップロードをしていきます。
オブジェクトタブから、ハンズオンサイトにあるファイルをダウンロードして、index.htmlデータをアップロードします。(ご自分で作成しても良いかと。)
S3のURLをブラウザに貼り付けることで、次のhtmlが表示されたらOKです。
画面を保持してタブを複製して作業を続けましょう。
CodeCommitを設定していく
リポジトリを作成します。
画面を保持してタブを複製して作業を続けましょう。
Cloud9を使用します。
テキストエディタの発展版のような存在ですね。協同で接続して開発が可能なようです。もっと売れて良さそう|д゚)
環境を作成していきます。
重い作業を行う場合は、インスタンスタイプを大きくしましょう。今回は最小でいきます。また、自動でEC2インスタンスを停める時間を設定できるのですが、今回の設定では時間切れにはなりませんが、結構長めに設定した方が作業環境としては快適です。
「開く」から設定を開始します。
インデントの設定を行います。
赤枠内「雲マーク」から「Soft Tabs」をyamlに合わせて「2」に設定します。
codeをcommitするために、認証ヘルパーというコードを実行して環境を構築します。
蛇足:
gitをローカルにインストールしてマネジメントコンソールからgitcommit用のユーザー名とパスを生成する方法もあると思います。gitをインストールしたらIAMからパス等を生成しましょう。
パスは必ずダウンロードしましょう。あとは、S3の画面でクローンのコマンドが表示されているので、git自体のユーザー名とアドレス設定を行った後に、ローカルのターミナルで実行して使用しましょう。
git自体のグローバルでの名前
git config --global user.name "あなたの名前"
アドレス設定
git config --global user.email "あなたのメールアドレス"
私の場合のS3に記載されているクローンのコマンド
git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/keiji-hanson-commit
現状リポジトリが空ですが、これでローカルで実行可能です。
ここで蛇足終わりです。
本線に復帰します。
「AWS 認証ヘルパー」とブラウザで検索して、gitが認証を必要とするたびに、認証情報を提供するために次のコマンドを実行。
公式サイト:
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-unixes.html
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true
昔懐かしのgitの初期設定を放り込みます。
グローバルでの名前
git config --global user.name "あなたの名前"
アドレスを指定
git config --global user.email "あなたのメールアドレス"
Cloud9のターミナルでこれまでのコマンドを実行可能なことを確認したら、gitのルートディレクトリに移動し、ブランチ名が(master)であることを確認します。
ルートディレクトリが不明である場合は、CodeCommitで設定したリポジトリ名の数文字を入力してTabキーを押下することで、ルートディレクトリを表示してくれます。もちろん記憶していればそのまま記載しても良いです。
例:cd keiji-hanson-commit/
次にCloud9上にもハンズオン資料のindex.htmlをアップロードしていきます。
gitコマンドを実行してきます。
変更された箇所の全てをステージングして。
git add -A
ステージングされた全てをコミットします。
git commit -m "init"
リポジトリにアップロードする。
git push origin master
次は赤枠のS3宛てとEC2宛てのパイプライン計2本を作成していく。
【ここで少しお勉強です。(私見盛りだくさんなので無視可)】
1 全般、一言で表現するとgitのブランチとかの感じ。
ブランチとして分ける場合は、パイプラインを分けて作成することで実現できるようです。
2 パイプラインタイプというものは、V1 タイプ、V2 タイプに価格と自由度が分かれており、自由度高く設定できる。デフォはV2タイプ。gitに慣れている方はこちらにしないと困りそう。
公式サイトでの説明:
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/pipeline-types.html
本編に戻ります。
先にCdodePipelineから作成します。
V2 タイプ(デフォルト)で作成を進めます。
Pipelineを2つ作成します。最初はS3に対してのPipeline作成。
ここで各ステージ間で受け渡しされる変数を作成することができます。また、Lambdaを介すことで動的に変数を設定させることもできるようです。
変数の設定細部:
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/reference-variables.html
S3を作成する設定や、KMSキーを使用するかを選べる。
今回は先に作成したS3を指定していきます。
接続先を選択します。S3やCodeCommit、gitなどを選択できます。
masterのみで、ソースはCodeCommitで設定します。
また、WatchEventsで自動的に変更される設定(デフォルト)とします。
蛇足:
githubを接続することが可能です。バージョン2を選択し、接続することでgithub上で変更を行うとCI/CD機能が働き、各本番、テスト環境などで自動的に実行される環境が作成できます。
githubと接続するためのアプリのインストールを行います。
数字が自動的に入りますね。このまま実行していまうと、接続が確立されてしまうので、ハンズオンの本編に帰ります|д゚)
本編に戻ります。
ビルドステージはスキップします。
S3宛てのパイプラインであり、CodeBuildを介さないためです。
デプロイステージではS3を宛先に作成していきます。
オプションが多く設定されていますね。
このまま次に進み、パイプラインを作成します。
次にS3へのコミットができるか確認します。
保存し忘れること多しなので、保存をして、コマンドでコミットしていきます。
コミットの際はコメントを任意に入力する必要があります。
ここで更に注意事項ですが、gitのリポジトリ(gitと繋がったディレクトリ)があるディレクリに移動する必要があります。
pwdコマンドやlsコマンドで移動すべきディレクトリに移動しましょう。
早速、add、commitとpushを行います。
add
git add -A
commit
git commit -m "update"
push
git push origin master
EC2にwebサーバーを構築する。
EC2作成
ネットワーク設定は、HTTPを許可する設定を追加します。
先程作成したIAMロールを設定します。
インスタンスに接続します。
yumを最新へ。
sudo yum update -y
Apacheをインストール
sudo yum install httpd -y
Apacheの起動
sudo systemctl start httpd.service
Apache自動起動設定
sudo systemctl enable httpd.service
EC2のパブリックアドレスをブラウザへペーストすると次のwelcomeが表示されます。
次にCodeDeployのLinux用エージェントをインストールします。
公式サイト:
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html
Rubyをインストール
sudo yum install ruby
ファイルをダウンロードするためもの
sudo yum install wget
私の場合のインストーラーのコマンド。こちらを確認ください。
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/resource-kit.html#resource-kit-bucket-names
wget https://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/latest/install
ディレクトリに権限を与えてから
chmod +x ./install
権限を確認していきます。
ls -la
CodeDeploy エージェントの最新バージョンをインストール
sudo ./install auto
サービスが実行されているかどうか確認
systemctl status codedeploy-agent
S3を作成します。
CloudBuildで作成したアーティファクト(成果物)を格納するためのS3を作成します。
今回はwebホスティングしないので公開せず、デフォルト作成。
CodeBuildを設定
ここの追加設定には同時ビルドの設定などが可能ですね。
CodePipelineで設定した内容に合わせブランチを選択します。
Linuxを選択し、最新のイメージ、バージョンを選択します。
動画などの処理を行うこともないので、GPU 強化コンピューティングにはチェックを付けません。
追加設定はマニアックですね。貼っておきますので参考までに。
動的な振る舞いを決めることができる箇所
特定のタグを自動で付ける等、少しだけアレンジできるようです。
先程作成したS3を選択していきます。
ログも取れるようです。
ここでIAMロールにポリシーをアタッチしていきます。
IAMの画面へ移動し、CodeBuildからCodeDeployにアクセス可能にするため、IAMロールの画面で「CodeBuild」と検索し、作成されたロールを発見します。その後、ポリシーを画像のように追加します。
私の場合「keiji-hanson-commit」直下にファイル「buildspec.yml」ディレクトリ「src」を作成。そして「index.html」を「keiji-hanson-commit」へドラック&ドロップで格納する。
buildspec.ymlを作成します。
この後にCodeDeployにpushするので、その際の動作(アプリの名前決め)を決めるために、コードを作成します。
公式サイト:
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html
※修正前:このコードは完成ではありません。
このテンプレートが公式サイトにありますのでコピーしてきます。
# ビルドスペックのバージョンを指定
version: 0.2
# フェーズ分けしますよ。
phases:
# HelloWorld_spec.rbというRubyテスト実行コードをビルド中にやりますよ。つまりやりたい動作を書く。
build:
commands:
- rspec HelloWorld_spec.rb
# 成果物(アプリ)について記載しますよ。
artifacts:
# 保存先ディレクトリ
files:
# 成果物(アプリ)に関するファイル全て保存しますよ。
- '**/*'
# 成果物の名前を次のかたちで作成しまっせ。
name: myname-$AWS_REGION
改良します。
Cloud9に貼り付けて作業します。
1 名前(name)は不要であるため削除
2 次のリンクを参考に、コードの加除を行う。
公式サイト:
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/application-revisions-push.html
「rspec HelloWorld_spec.rb」を「aws deploy push」に置き換える。
つまり、プッシュします。ということ。このプッシュにはオプションを指定できるので、「 --application-name ☆☆☆」を追記する。☆は後で入れる。
3 S3のロケーションを追記する。「 --s3-location s3://バケット名/ファイル名 ソースはココにある」スラッシュ以下は実際に作成したバケットなど確認。
実際のバケット名:keiji-artifact-s3
作りたいファイル名:artifact.zip
ディレクトリ: --source src
4 「base-directory:src」を最終行に追加する。
修正結果↓↓↓
# ビルドスペックのバージョンを指定
version: 0.2
# フェーズ分けしますよ。
phases:
build:
# S3にaws deploy pushするよ。名前は☆☆☆。
commands:
- aws deploy push --application-name ☆☆☆ --s3-location s3://keiji-artifact-s3/artifact.zip --source src
# 成果物(アプリ)について記載しますよ。
artifacts:
# 保存先ディレクトリ
files:
# 成果物(アプリ)に関するファイル全て保存しますよ。
- '**/*'
# ここに成果物を置くことにしているよ。
base-directory: src
IAMロールを作成します。
新規にIAMロールを作成し、CodeDeployにアタッチするロールを作成します。
Codedeployでアプリを作成していきます。
アプリケーション名がわかったので、Cloud9で作成中のコードに追記します。
完成です。
version: 0.2
phases:
build:
commands:
- aws deploy push --application-name keiji-codedeploy-app --s3-location s3://keiji-artifact-s3/artifact.zip --source src
artifacts:
files:
- '**/*'
base-directory: src
デプロイグループを作成します。
オレンジのボタンから作成します。
名前は適当に、サービスロールは先程作成したものを選択
ブルーグリーンデプロイメントが選択できますね。
インプレースで進めますが、Blu/Greにすると中断を局限できそうですね!
先に作成したEC2にデプロイしますよと指定する。
CodeDeployエージェントは手作業でインストールしたので、「なし」です。
デプロイを複数台同時にデプロイする場合や、徐々にデプロイするなど、選択できるが、画像のとおり単発でデプロイする方式を選択
ロードバランサーは使用しません。
オプションを参考に貼っておきます。
アラームや、SNSの設定もできるようです。
Cloud9でymlファイルを作成する。
Cloud9にて、「src」配下に「appspec.yml」を作成します。
appspec.ymlの書き方公式資料:
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file.html
使用するコード
version: 0.0
os: linux
files:
- source: index.html
destination: /var/www/html/
保存を必ず行って、次のコマンド
git add -A
git commit -m "create"
git push origin master
早速ビルドを開始していきます。
CodeDeployへ移動し、「ビルドプロジェクト」からプロジェクトにチェックを付けて、ビルドを開始します。
頭の整理w:コミット⇒プッシュ⇒ビルド⇒デプロイ
ビルドが出来ましたので、次に成果物(アプリ)をデプロイします。
リビジョンの場所は、作成したバケットを選択します。そしてzipを選択します。
補足としてデプロイの詳細を設定できるようです。参考までに。
このままデプロイのボタンをクリックします。
デプロイできたようです。
EC2に移動してブラウザにパブリックアドレスを貼り付けて、確認します。
できていますね ^^) _旦~~
ここから自動化(CI/CD)していきます。
CodePipelineで一気にデプロイしていきます。
EC2を対象として新たにパイプラインを作成します。
※今回は自動で行うので「ビルド」の項目もしっかり設定します。
注意が必要な箇所のみスクショしています。基本的には一回目の設定と同じで大丈夫です!
はい。エラーです。
結論「IAMポリシー不足」です。CodeBuildにアタッチしているポリシーがS3からのダウンロード「"s3:GetObject"」権限が必要でした。
CLIENT_ERROR: error while downloading key keiji-hanson-ec2-2/SourceArti/mQEbB9D, error: AccessDenied: Access Denied status code: 403, request id: 7K1N256HGBXCE8DQ, host id: MEJNzsnBF1YDUM/DV9aiYpO419hTOLRyBwjKETYZqzC0IVnXldgM3dLAgSKWhO0cdCrmW5VxiWU= for primary source and source version arn:aws:s3:::keiji-artifact-s3/keiji-hanson-ec2-2/SourceArti/mQEbB9D
翻訳:
「クライアントエラー: キー keiji-hanson-ec2-2/SourceArti/mQEbB9D のダウンロード中にエラーが発生しました。エラー: AccessDenied: アクセスが拒否されました。ステータスコード: 403, リクエストID: EWJSFC1AKTG3KH4E, ホストID: 55kpabAPc/1foAmZRR4svatG9U0EkoP8NkM63Tib/hPN6S+7cBiccEkR0462c7GTLsRaC8+ROT+N4lQVe1gU0g==。主要ソースおよびソースバージョン arn:aws:s3:::keiji-artifact-s3/keiji-hanson-ec2-2/SourceArti/mQEbB9D に対して」
やったこと。
1 コンソール内で結構深くまでエラーを確認することができました。CodeBuildの工程において、アップロードは可能だけれど、そのデータをダウンロードする工程でエラーが発生したことを認識することができました。
2 CodeBuildに権限が不足しているということで、S3へのFullAccessポリシーをアタッチしました。
※この工程で解決することができましたが、本来であれば、FullAccessではなく「"s3:GetObject"」をCodeBuildのロールにアタッチしてあげないといけませんでした。
リソースの削除
- Cloud9を削除します。
赤枠からダッシュボードに戻ります。
ここで削除します。
- EC2を終了(削除)します。
- CodePipelineを削除します。
- CodeCommitのリポジトリを削除します。
- CodeBuildのビルドプロジェクトを削除します。
- CodeDeployのアプリを削除します。
- S3を削除します。
さいごに
正直何度かやらないと、手際よくはできないと感じます。CI/CDと言えどコマンドは実行するのだなと勉強になりました。ビルドスペックファイルにテストコマンドを記載することで、アプリデプロイに係るテスト自動化など、他のサービスと組み合わせることで益々使いよくなりそうだと感じました。
では!