Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
第4回 AWSとGitHub勉強会 - GitHub Actionsを使ったCD環境の構築 -
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
荻原利雄
September 18, 2023
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
第4回 AWSとGitHub勉強会 - GitHub Actionsを使ったCD環境の構築 -
荻原利雄
September 18, 2023
More Decks by 荻原利雄
See All by 荻原利雄
先取りMaven4 ~16年ぶりのメジャーアップデート、その進化とは?~
ogiwarat
0
170
実践ArchUnit ~実例による検証パターンの紹介~
ogiwarat
2
1.3k
Spring Frameworkの新標準!? ~ RestClientとHTTPインターフェース入門 ~
ogiwarat
4
2.9k
Spring Boot vs MicroProfile ~クラウドネイティブにおけるフレームワークの比較と選択~
ogiwarat
2
2.5k
第1回 AWSとGitHub勉強会 - キックオフ -
ogiwarat
0
1.1k
第2回 AWSとGitHub勉強会 - CodespacesとHelidonの利用 -
ogiwarat
0
1.1k
第3回 AWSとGitHub勉強会 - GitHub Actionsを使ったCI環境の構築 -
ogiwarat
0
1.1k
第5回 AWSとGitHub勉強会 - AWS EC2環境の構築 -
ogiwarat
0
1.1k
第6回 AWSとGitHub勉強会 - AWS ECS Fargate環境の構築 -
ogiwarat
0
1.3k
Other Decks in Programming
See All in Programming
Swiftのレキシカルスコープ管理
kntkymt
0
220
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
240
CSC307 Lecture 17
javiergs
PRO
0
320
Oxlintのカスタムルールの現況
syumai
6
1.1k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
120
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
210
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
750
TAKTでAI駆動開発の品質を設計する
j5ik2o
6
1.2k
ふつうのFeature Flag実践入門
irof
7
3.7k
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.4k
OSもどきOS
arkw
0
520
Featured
See All Featured
Marketing to machines
jonoalderson
1
5.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Accessibility Awareness
sabderemane
1
140
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
300
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
580
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
320
A Tale of Four Properties
chriscoyier
163
24k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
Transcript
AWSとGitHubを使ってみよう勉強会 ~ 第4回 GitHub Actionsを使ったCD環境の構築 ~ 株式会社 豆蔵 ビジネスソリューション事業部 updated:2023/9/18
本日の内容 • 前回の課題の回答(35分) • 次回までの課題の説明(35分) ※「前回の課題の回答」で補足も含めているため今回は「課題の補足はなし 2 画面キャプチャやコマンド操作等はGitHubのssi- mz-studygroupユーザで行った例となります。キャ プチャやコマンド等の該当部分は自分のユーザIDに
読み替えてください ・ssi:simple server infra ・mz:mamezou
3 前回の課題の回答
前回の課題(再掲) 4 手を動かす所 課題を思い出すのも兼ね、前回の資料をもとに課題を実 施してみる
ワークフローの全体像 – 各論に行く前に 5 name: image-publish on: workflow_dispatch: jobs: build:
runs-on: ubuntu-latest permissions: contents: read packages: write steps: - uses: actions/checkout@v3 - name: Set up JDK 17 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' server-id: ghcr.io settings-path: ${{ github.workspace }} - name: Publish to GitHub Packages Apache Maven run: mvn -B package docker:build docker:push -Dimage.tag=`date +%Y%m%dT%H%M%S-%3N` --file pom.xml -s $GITHUB_WORKSPACE/settings.xml env: # 自分のリポジトリへのアクセスなのでPATではなく GITHUB_TOKENの権限で登録もできる GITHUB_TOKEN: ${{ github.token }} ※見やすいように改行しています <image-publish.yml> このワークフローの目的 ✓ コンパイルしてjarを作って、 ✓ 動作させるコンテナイメージをビルドし ✓ GitHub Container Registry(ghcr.io)にpushする チェックアウト Javaのsetup Mavenコマンド実行
実行しているMavenコマンドの詳細 6 mvn -B → ① package → ② docker:build
→ ③ docker:push → ④ -Dimage.tag=`date +%Y%m%dT%H%M%S-%3N` → ⑤ --file pom.xml → ⑥ -s $GITHUB_WORKSPACE/settings.xml → ⑦ ① Mavenのバッチモードオプション(コンソールログ出力を少なめにする) ② packagフェーズの実行。これによりJavaのコンパイルとclassファイルのjarファイル化が行われ、結果が./target以下に出力される ③ dockerプラグインのbuildゴールの実行。これによりdockerプライグインの定義に従い、コンテナのビルドが行われる ④ dockerプラグインのpushゴールの実行。これによりdockerプライグインの定義に従い、コンテナレジストリへのpushが行われる ⑤ pomに定義したimage.tagプロパティの上書き指定。``(バッククオォート)によるdataコマンドがシェルで即時実行され、その結果がimage.tagプロパティに設定さ れる(例:20230726T055802-719)。 dockerプラグインではビルドしたイメージのタグ名とpushするイメージの対象に使われる ⑥ 実行するpomファイルを指定するオプション。この場合プロジェクト直下のpomが使用される(デフォルトと同じなのでこの場合は省略化) ⑦ setup-javaアクションにより生成されたghcr.ioへの接続情報が設定されたsettings.xmlを指定する
Mavenコマンドの実行の流れ – 1/2 7 $ mvn package target ├─hello-app.jar ├─libs
│ ├─aopalliance-repackaged-3.0.3.jar │ ├─helidon-common-3.2.1.jar │ ├─helidon-common-configurable-3.2.1.jar │ ... $ mvn docker:build <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.40.2</version> <configuration> <registry>ghcr.io</registry> <images> <image> <name>ssi-mz-studygroup/hello-app</name> <build> <tags> <tag>${image.tag}</tag> </tags> <contextDir>${project.basedir}</contextDir> <cleanup>try</cleanup> </build> </image> </images> </configuration> </plugin> # ベースイメージはeclipse-temurin(旧OpenJDK)のJava17を使用 FROM docker.io/eclipse-temurin:17-jre-alpine # 作業ディレクトリを/(root)にする WORKDIR / # Mavenのビルド成果物(sample-app.jar)をコンテナイメージにCOPY COPY ./target/hello-app.jar ./ # Mavenのビルド成果物(libs以下を)をコンテナイメージにCOPY COPY ./target/libs ./libs # ExecutableJarをjavaコマンドで起動 CMD ["java", "-jar", "./hello-app.jar"] ビルド成果物をイメージにCOPY ./Dockerfile dockerプラグインの設定 contextDir直下(プロジェクト直下)のDockerfileを使ってイメージをビルドする buildした イメージを 登録 nameタグの値をイメージ名しタグにtagタグに設定されている値を付ける
Mavenコマンドの実行の流れ – 2/2 8 $ mvn docker:push <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId>
<version>0.40.2</version> <configuration> <registry>ghcr.io</registry> <images> <image> <name>ssi-mz-studygroup/hello-app</name> <build> <tags> <tag>${image.tag}</tag> </tags> <contextDir>${project.basedir}</contextDir> <cleanup>try</cleanup> </build> </image> </images> </configuration> </plugin> dockerプラグインの設定 [nameタグ]:[tagタグ]がpush対象 pushする先 イメージを push <servers> <server> <id>ghcr.io</id> <username>${env.GITHUB_ACTOR}</username> <password>${env.GITHUB_TOKEN}</password> </server> </servers> dockerプラグインの設定 setup-javaアクションで生成されたsettings.xml ghcr.ioに対する認 証を情報を参照 ✓ ${env.ENV_VAL}はENV_VALの環境変数を参照する設定 ✓ GITHUB_ACTORとGITHUB_TOKENはGitHubActionにより環境変数に設定される ✓ GITHUB_TOKENはそのワークフロー限り有効なアクセストークン
GitHub Actions中のコンテナ操作 • dockerプラグインが行っている操作はコマンドレベルでは以下と同じになる • 今回はDockerコマンドの実行をプラグインで行ってくれるdockerプラグインを使ったが、 run: で直接dockerコマンドを実行する形式でも同じことができる(通称:ランラン♪して実 行するパターン) •
ただし、run:でdockerコマンドを実行する場合はghcr.ioへの認証(docker login) が必要となるため、そのIDとパスワードの管理が必要となる。どこに保存してどうやって 参照するかは少し工夫が必要 9 # タグの値を取得 IMAGE_TAG=`date +%Y%m%dT%H%M%S-%3N` # ./Dockerfileを使ってコンテナイメージをビルド docker build -t ssi-mz-studygroup/hello-app:${IMAGE_TAG} . # ghcr.ioへpushするためにコンテナ名にprefixを付ける docker tag ssi-mz-studygroup/hello-app:${IMAGE_TAG} ghcr.io/ssi-mz-studygroup/hello-app:${IMAGE_TAG} # ghcr.ioへのpushの実行 docker push ghcr.io/ssi-mz-studygroup/hello-app:${IMAGE_TAG}
参考情報 • 今さら聞けないMaven – コンテナも一緒にビルドしたい。テスト実行前にコンテナを起動したい | 豆蔵デ ベロッパーサイト • https://developer.mamezou-tech.com/blogs/2022/08/31/docker_with_maven/
• 「テスト実行前にコンテナを起動したい」の章は関係なし • GitHub Packages Container Registryをモデリングしてみた – UMLを理解の道具として | 豆蔵デ ベロッパーサイト • https://developer.mamezou-tech.com/blogs/2023/03/09/ghcr-modeling/ • 今さら聞けないMaven – コンテナのビルドと一緒にpushもMavenでしたい。 | 豆蔵デベロッパーサイト • https://developer.mamezou-tech.com/blogs/2023/03/02/docker-push-with-maven/
11 次回までの課題の説明 キャプチャを取得するために利用したAWSリソースは すべて削除しています。 説明では上記対策を行った上で例を分かりやすくす るため一部セキュリティ情報含んだ画面キャプチャを 使用しています。本来は好ましくないためその点はご 留意ください。
次回までの課題 • テーマ • GitHub Packgesで公開したコンテナイメージをAWSのEC2で動かす • お題 • AWSアカウントを作成する(まだない人)
• EC2インスタンスを作成する • SSHでEC2に接続する • EC2環境を構築する(Dockerエンジンのインストールなど) • GitHub Packageで公開したコンテナイメージを起動する • ゴール • AWS上のコンテナアプリをローカルから呼び出せること 12
課題の実施手順 Step1. AWSアカウントを作成する(まだない人) Step2. EC2インスタンスを作成する Step3. SSHでEC2に接続する Step4. EC2環境を構築する(Dockerエンジンのインストールなど) Step5.
GitHub Packageで公開したコンテナイメージを起動する Step6. AWS上のコンテナアプリをローカルから呼び出す 13
演習アドバイス • 困ったことがあったら • 今回の演習対象のAWSのアカウント作成とEC2に関することはネットに沢山あります • 困ったな?これなんだ?と疑問に思ったことはグーグル先生かChat GPTに聞くと大抵答えを教えてくれます • ただし、検索結果の上位にAWSのドキュメントが掛かりますが、これを最初に見るのは避けましょう
• 対象を分かっている状態でマニュアル的に参照するに分にはよいですが「どうやればいいのだろ?」な状態でAWSのドキュメントをみると 余計?が増えます。まずはクラスメソッドさんのブログやQiitaなど平易に書かれてそうな記事を見るのがお勧めです • 演習手順でこれは気をつけましょう(先に言っておきます) • ルートユーザとは別にIAMユーザを作成し、普段の作業はIAMユーザで行うようにする • ルートユーザもIAMユーザも認証はMFAを有効化する、絶対 • EC2のソフトウェアイメージ(AIM)はAmazon Linux 2023 AIMではなく Amazon Linux 2 AMI(HVM)を使う • EC2のインスタンスタイプはt2.microを使う • EC2は使い終わったら課金がもったいないので停止する • なお「インスタンスの終了」はインスタンスの削除なので間違いないこと。停止は「インスタンスの停止」 14
Step1. AWSアカウントを作成する(まだない人)- ルートアカウントの作成 • AWSのアカウントを作成する • ここはキャプチャを採れないので「AWSアカウント 作成」で検索すると情報が沢山でるのでネットの 情報を見ながら作成 •
ルートアカウントの作成だけは以下のAmazonの公式が分かりやすい https://aws.amazon.com/jp/register-flow/ • アカウントを作成したら必ずMFA認証を有効化すること • MFA認証の有効化はIAMユーザと同じなので、21-22スライドを参考にする 15
Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(1/8) • 通常操作を行うIAMユーザを作成する • ルートユーザは権限が最強なので通常作業を行うIAMユーザを作成する • IAMユーザの権限はみんなで使う環境ではないのでAdministratorグループでOK •
こちらのユーザも必ずMFA認証を有効化すること ▪ ルートユーザでログインしている状態で開始! ①IAMを入力して検索 ②クリック
Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(2/8) ①ユーザメニューをクリック ②クリック 17
Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(3/8) 18 ①任意のユーザ名を入力 ②必ずこちらを選択 デフォルトのままでもOKだが、 お好みで変更してもOK ③入力が完了したらクリック
Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(4/8) 19 ①デフォルトのこちらになっていることを確認 ②チェックを付ける ③入力が完了したらクリック 「グループの作成」でAdministratorAccessポリシーをアタッチした Administratorsグループを作成してからの手順となります。 グループの作成手順は
https://zaitakufrog-blog.com/iam-administrator/#toc9 の①~③の手順と同じになります
Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(5/8) 20 ①内容を確認してクリック この画面までこれたら登録は完了! ②クリックして一覧へ この数字12桁の部分が登録したユーザ のユーザIDとなる 下線部の3つは後でロ
グインするときに使うの で忘れずに控えておく こと *******
Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(6/8) 21 ①登録したユーザをクリック ▪ MFAの有効化 ②ここをクリック ③ダイアログが出てくるので有 効化をクリック
*******
Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(7/8) 22 ①デバイスを識別する任意の名称を入力 ②こちらになってることを確認 (デフォルトのまま) ③クリック ④スマフォのAuthenticator アプリで
このQRコードを読み取る ⑤QRコードを読み取ったアプリで 表示されているワンタイムパスワー ドを入力する ⑥MFAコード1で入力したパスワードの次に表示されたパ スワードを入力する ⑦クリック *** ***
Step1. AWSアカウントを作成する(まだない人)- IAMユーザの作成(8/8) ①MFAが有効化されてるのを確認できたらすべ て完了🙌 ②サインアウトして登録したIAMユー ザでログインしなおす 23 *******
Step2. EC2インスタンスを作成する(1/9) ▪ 先ほど登録したIAMユーザでログインする 24 ②ユーザ登録時に控えた数字 12桁のユーザIDを入力 ①IAMユーザを選択 ③入力したクリックして次へ ④ユーザ登録時に控えたそれぞれの内容
を入力したらクリックして次へ ⑤スマフォのワンタイムパスワードを 入力してクリック ※このユーザは既に削除しています ******* ***
Step2. EC2インスタンスを作成する(2/9) ▪ ログイン後の確認とEC2画面へ ②東京はコレ ①リージョンが東京になっているか確認なって いない場合は東京を選択 初めから東京が選択されている場合もある。 その場合はそれでOK EC2を入力して検索
③クリック 25
Step2. EC2インスタンスを作成する(3/9) ▪ インスタンスの作成 ①ダッシュボードをクリック ②インスタの起動をクリック
Step2. EC2インスタンスを作成する(4/9) ①任意のインスタンス名を入力 ②Amazon Linuxを選択(デフォルト) ③Amazon Linux 2 AMI(HVM)を必ず選択 ④デフォルトのt2.microでOK
⑤クリックして作成へ ⑥任意のキー名を入力 ⑦あとはデフォルトのままで 作成をクリック ⑧ダウンロードダイアログがでるのでロー カルの任意の場所に保存 ***
Step2. EC2インスタンスを作成する(5/9) ①すべての入力が完了したらここをクリック。なお、 前スライドで特に指示のない項目はデフォルトの ままでよい ②インスタンスの作成は完了 したので、クリックして一覧へ もどる
Step2. EC2インスタンスを作成する(6/9) ▪ セキュリティグループの設定(7001ポート開ける) ※この手順はデモではやらなかったものになります。 やらなかった理由は単に忘れてましたmm ①作成したインスタンスのリン クをクリックして詳細画面へ 29
Step2. EC2インスタンスを作成する(7/9) 30 ①起動したEC2インスタンスに割り当てら れたパブリックIPアドレス ローカルからcurlでREST APIを呼ぶ 時に使用するため控えておく ②セキュリティタブをクリック ③クリックしてセキュリティグ
ループの変更へ ************
Step2. EC2インスタンスを作成する(8/9) ②クリック ③クリックして行を追加 ④クリックで追加された行を 編集 カスタムTCP, 7001, Anywhere IPv4になるように入力&選択
①クリック ⑤行の追加ができたらクリックして保存
Step2. EC2インスタンスを作成する(9/9) ▪ SSHクライアントの接続方法の確認 ①確認するインスタン スにチェック 32 (一覧に戻って行う) 下線部は後で実施するSSHクラ イアントからの接続で使うコマンド
なので控えておく ③確認が終わったらク リックして元の画面へ 戻る これでEC2インスタン スの作成は完了です ②インスタンスにチェックしたら クリック
Step3. SSHでEC2に接続する(1/1) ▪ ローカルのSSHクライアントからEC2に接続する (Windowsは標準でSSHクライアントは入っていないため、ネットなどで調べて各自で好きなものをインストールしてくだ さい) • SSHクライアントを起動しpemファイルを保存したディレクトリに移動する • AWSコンソールの「接続」画面で確認した下線部のコマンドを実行する
• 2つ目のSSHコマンドの引数は個人ごとに異なります これがでれば接続OK • EC2インスタンスに割り当てられるパブリックIPアドレスは EC2の起動ごとに変わる • なので、EC2を再起動した場合はAWSコンソールの前 スライドの「接続」で再度接続に必要なコマンドを確認し、 それを利用すること
Step4. EC2環境を構築する (1/4) ▪タイムゾーンとロケールの設定 • コマンドはhttps://github.com/mamezou-tech/try-aws-github-learningに記載しているのでそちらからコピー して実行してください。このキャプチャは実行イメージと結果の確認目的となります(以降のスライドも同じです) タイムゾーンがAsia/Tokyoになっていること 結果が左記のとおりになっていること
Step4. EC2環境を構築する (2/4) ▪Dockerのインストール • パッケージの最新化 ←最後にComplete!が出力されればOK
Step4. EC2環境を構築する (3/4) ▪Dockerのインストール • Dockerエンジンのインストール ←最後にComplete!が出力されればOK ←最後にComplete!が出力されればOK
Step4. EC2環境を構築する (4/4) ▪Dockerのインストール • Dockerの開始 ←active(runnningになっていればOK) • Dockerの自動起動の設定 ↑
CreatedがでればOK 37
Step5. GitHub Packageで公開したコンテナイメージを起動する ▪コンテナの起動 • Docker runでコンテナを起動 ←最後にコンテナID(乱数)が出力されればOK • ログから起動を確認
38 ↑ StartedのログがでればOK ※:ssi-mz-studygroupの部分はご自身のGitHubのIDになります 38
Step6. AWS上のコンテナアプリをローカルから呼び出す ▪別のコントールを立ち上げてローカル環境からAWS上のREST APIを呼び出す • 接続IPアドレスは個人ごとに異なります • 接続IPアドレスはEC2インスタンスのIPアドレスで、EC2インスタンスを作成したときに確認して控えてお いたアドレスになります。 ↑
Helloが返ってくれば成功です! 今回の課題はこれで終了です。お疲れさまでしたmm 39 • EC2インスタンスに割り当てられるパブリックIPアドレスは EC2の起動ごとに変わる • なので、EC2を再起動した場合はAWSコンソールから 再度パブリックIPアドレスを確認すること(IPアドレスの確 認方法は30スライドを参照)
40 次回の予定
次回の予定 • 今回の課題の説明 • 補足説明と質疑応答 • 次回までの課題の説明 • コンテナイメージを今度はサーバーレスのECS Fargateを使って動かす!
(ついに完結!) 41