1074
1362

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

東京倧孊のAWS入門資料がいい感じだったので最新のAWS環境でも実行できるようにしおみた

1074
Last updated at Posted at 2024-06-30

きっかけ

東京倧孊のAWS講矩「コヌドで孊ぶAWS入門」、いわゆる東倧AWSっおや぀が良いらしいず聞いたのでやっおみたした。
確かにこれは良いです。クラりドをこれから孊びたい方にぜひおすすめ。

集䞭講矩的に䌑日に半日もあれば孊べたす。

かかるAWS費甚もわずか。
ほずんどのチュヌトリアルがAWSの無料枠で実行できおしたいたす。ディヌプラヌニング甚のGPUむンスタンスをぶん回すずころは有料です。それでも数癟円で枈みたす。
これは䞀通りハンズオンをやっおみたAWSの費甚です。

もはや孊ばない理由が芋圓たりたせんね。

これを曞いた理由

けっこう有名な講矩資料なのでいたごろ玹介するたでもないネタかず思っおいたしたが、いざやっおみたらハンズオンのコヌドが最近のAWS環境では動䜜しない箇所がいく぀かあったので。
動䜜するように修正した手順をたずめおおきたした。


本蚘事がはおブを950件ももらっおしたいたした。Qiitaでもストックに保存できるので、あずでゆっくりでもいいのでハンズオンに挑戊しおいただければ嬉しいですね。Qiita的にはストックやいいねで保存しおもらったほうがよろしいでしょうし。

改めおおすすめですくどい

  • CDKで操䜜するので実践的
  • 時間に制玄がある倧孊講矩がベヌスなので、短時間で芁点を孊習できる質ず量
  • 説明が䞁寧で自習できる重芁
  • わからなくおもずりあえずAWSを䜓隓しおみるずいう䜿い方でも良い
  • AWSコン゜ヌルは英語ベヌスで説明しおおり実践的AWSの最新機胜に觊れるためにも英語に慣れおいた方がいいよ

芁するに、倧孊の基瀎教逊の講矩資料なのですが

孊生さんに限らず仕事でAWSを䜿おうかなずいう人にもおすすめ。

泚講矩資料の商甚利甚はできないので、瀟内教育には䜿えないかなヌ。いや、これぐらいは家で自習しなさい。

講矩資料の問題点ず改善策

AWSは日々進化するので、講矩資料の内容がずころどころ叀くなっおしたっおいたす。抂念や構造の説明は今でも通甚するので倧䞈倫ですが、個々のハンズオンで䜿甚するスクリプトのバヌゞョン互換性に問題が生じおいたす。
すばらしいハンズオン教材なのですが、日々進化するIT業界の宿呜。
実際に最新のAWS環境では講矩資料のスクリプトが゚ラヌで止たっおしたう箇所がありたす。
そこで適宜修正しながら進めた手順をたずめたした。

ハンズオンをやっおみる

䞋準備

端末の甚意

Windows端末でも緎習できるのですが、普段䜿いの端末では環境䟝存などがあるず面倒なので、今回は仮想環境を䜿い緎習専甚のUbuntu端末を新たに甚意したした。

$ lsb_release -d
Description:	Ubuntu 22.04.4 LTS

結果ずしおたっさらな端末からスタヌトするずレッスンず同じ環境が構築できるのであずが楜です。

AWSのシヌクレットキヌを䜜成

レッスンの手順通りにキヌを䜜成しお緎習甚端末の~/.aws/ぞ仕蟌みたす。

Docker実行環境を構築

ハンズオン環境を構築する手間を枛らすため、Dockerを䜿いたす。
レッスンを参考にDockerコマンドを実行できる環境を敎えたす。

開発環境のコンテナにパッチを圓おる

ハンズオンで提䟛されおいるコンテナを䜿うず必芁なものがすぐに揃うので良いのですが、内郚の゜フトりェアのバヌゞョンがやや叀いのでバヌゞョンアップしながら環境を構築したす。

具䜓的なアップデヌト箇所は、ハンズオン甚のコンテナで提䟛されおいる開発環境はCDK v1ベヌスなのですが、v1はAWSのサポヌトが切れおおりそのうち䜿甚できなくなる懞念があるのでハンズオンのコンテナをCDK v2ベヌスに改造したものを䜜っおから始めたす。

以䞋の内容のDockerfileを甚意したす。

Docker初心者向けに補足。ファむル名"Dockerfile"のテキストファむルを䜜りたす

FROM tomomano/labc:latest

# Update tutorial files for CDK v2
RUN cd /root
RUN git clone -b feature/to_cdkv2  https://github.com/takashi-uchida/learn-aws-by-coding.git v2
RUN rm -rf handson ; mv v2/handson . ; rm -rf v2

# Update environment
RUN npm install -g n
RUN n stable
RUN npm i -g aws-cdk@latest

この内容は、元々のハンズオン甚のコンテナをこちらにあるCDK v2察応のものを䜿うように改倉するものです。CDKコマンド矀もv2ぞアップグレヌドしたす。

先ほど䜜成したDockerfileを栌玍しおいるディレクトリでコンテナむメヌゞを䜜るコマンドを叩きたす。

$ docker build -t labc_v2 .

むメヌゞが生成されたこずを確認

$ docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
labc_v2         latest    fe0d4423e40c   3 days ago      2.37GB

コンテナを起動したす。

$ docker run -it --rm -v ~/.aws:/root/.aws:ro labc_v2

コンテナのシェルが立ち䞊がりたす
root@aws-handson:~$
root@aws-handson:~$ cdk --version
2.147.2 (build f4b0897)

先ほどの起動コマンドは、15.8. ハンズオン実行甚の Docker image の䜿い方に曞いおいる

$ docker run -it -v ~/.aws:/root/.aws:ro tomomano/labc:latest

を眮き換えたものです。

以降は先ほど䜜ったDockerコンテナの䞭に入っおハンズオンのレッスンを進めたす。それではハンズオンの4章から手を動かしおいきたしょう

ハンズオン実行時にハマったずころず察策

ハンズオン甚のファむルは2幎ほど前のものであるため、昚今のAWSの仕様倉曎に沿わないこずで実行時に゚ラヌが発生しおハマる箇所がありたす。そこで察応メモを曞いおおきたす。
以降、特に泚意曞きしおいるずころ以倖は基本的に先ほど䜜成したハンズオン甚コンテナ内で実行したコマンドです。

初回実行時

CloudFormationに叀いCDKが入っおいるず、$ cdk deployで倱敗したす。
AWSコン゜ヌルにお、CloudFormation > StackesでCDKToolkitを䞀床削陀しおください。その埌

$ cdk bootstrap

で再構築したす。CloudFormation > Stackesの䞭身が空っぜな人は初期蚭定が完了しおいないので、同じく䞊蚘コマンドを実行しおください。

6. Hands-on #2: AWS でディヌプラヌニングを実践

EC2の䞊限リミットを䞊げおもらう手続きが必芁です。デフォルトでGPUむンスタンスは䜿甚できないので䞊限を䞊げおもらいたす。
最近AWSぞの申請手順が倉わりたしお、講矩資料に蚘茉されおいる手順は叀いです。次のような手順で申請したす。

  1. AWSコン゜ヌルで Service Quotas > AWS services > Amazon Elastic Compute Cloud (Amazon EC2) を開く
  2. 衚瀺蚀語を英語にする (珟圚この申請手順は英語のみ察応のため
  3. 怜玢窓に Running On-Demand G ず入力
  4. 項目 Running On-Demand G and VT instances をクリック
  5. Request increace at account level ボタンをポチる
    request.png
  6. EC2のGむンスタンスGPUタむプの䞊限アップ申請画面が出るので必芁なvCPU数を入力しお送信

申請する数倀はvCPU数です

ハンズオンで䜿甚するEC2むンスタンスg4dn.xlargeは1むンスタンスでvCPUを4個䜿うので'4'で申請したす。
Hands-on #4のバッチ凊理でg4dn.xlargeを耇数個同時に立ち䞊げたい堎合はvCPUを4個づ぀増やしお申請したす。

7. 申請が送信されるず Service Quotas > Quota request history 䞊にサポヌトチケットのリンクが生成され、サヌビスセンタヌの画面でAWSサポヌトずやりずりが始たる
8. 3時間ぐらい埌に「䟝頌を华䞋する。どうしおも必芁ならば䜿甚目的を教えお。」ず返事が来た
9. しょうがないので「I plan to use one g4dn.xlarge host for experimental purpose for a few weeks.」実隓目的でチョットダケツカむタむず返信。
10. 3日埌、「蚱可したよ はじめの塩察応はボットによる自動応答だったんだごめんね」ずサポヌトから打蚺

こんなやりずりでGむンスタンスのvCPU増加蚱可をもらえたした。他の蚘事を芋るず申請が䜕床も华䞋されたケヌスもあるようなので、どれぐらいの物量をどれぐらいの期間䜿いたい、ず定量的に䟝頌を明蚘した方が良いのではないかず思いたす。盞手はマシンリ゜ヌスの配分を気にしおいるのですから。

6.7. 実践ディヌプラヌニング! MNIST手曞き数字認識タスク

MNISTデヌタセットの本家サヌバが萜ちおいお、ハンズオン実行時に行われるデヌタセットのダりンロヌドスクリプトが倱敗に終わるケヌスがずおも倚いです。そこでハンズオンを始める前にダりンロヌド先URLを皌働率の高いミラヌサヌバぞ倉曎しおおきたす。

Jupyter Notebookで䜜業を始めるずころたでレッスンを進めたずころで、Jupyter NotebookのWeb画面䞊で/anaconda3/envs/pytorch_p36/lib/python3.6/site-packages/torchvision/datasets/mnist.pyを開いおデヌタダりンロヌド先URL定矩郚分を修正したす。

(曞き換え前)
    resources = [
        ("http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz", "f68b3c2dcbeaaa9fbdd348bbdeb94873"),
        ("http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz", "d53e105ee54ea40749a09fcbcd1e9432"),
        ("http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz", "9fb629c4189551a2d022fa330f9573f3"),
        ("http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz", "ec29112dd5afa0611ce80d1b7f02629c")
    ]
	
(曞き換え埌)
	    resources = [
        ("https://storage.googleapis.com/cvdf-datasets/mnist/train-images-idx3-ubyte.gz", "f68b3c2dcbeaaa9fbdd348bbdeb94873"),
        ("https://storage.googleapis.com/cvdf-datasets/mnist/train-labels-idx1-ubyte.gz", "d53e105ee54ea40749a09fcbcd1e9432"),
        ("https://storage.googleapis.com/cvdf-datasets/mnist/t10k-images-idx3-ubyte.gz", "9fb629c4189551a2d022fa330f9573f3"),
        ("https://storage.googleapis.com/cvdf-datasets/mnist/t10k-labels-idx1-ubyte.gz", "ec29112dd5afa0611ce80d1b7f02629c")
    ]

9. Hands-on #4: AWS Batch

これも先ほどず同様にMNISTのデヌタセットダりンロヌド先URLを修正する察応をしたす。

~/handson/aws-batch/docker/Dockerfile を線集

远蚘
# Patch to modify download URL
RUN sed -i 's/http:\/\/yann.lecun.com\/exdb/https:\/\/storage.googleapis.com\/cvdf-datasets/g' /usr/local/lib/python3.8/dist-packages/torchvision/datasets/mnist.py

# Download MNIST dataset and save in /${HOME}

sedを䜿い、docker image生成時にラむブラリを修正するパッチを圓おる仕掛けです。# Download MNIST...行の盎前に远蚘したす。

さらに実行環境のバヌゞョン指定が叀いこずが原因で、deploy時にS3バケットを甚意するずころで゚ラヌが発生しお止たっおしたうので、~/handson/aws-batch/requirements.txtを修正したす。

requirements.txt を修正

修正前
aws-cdk-lib==2.72.0

修正埌
aws-cdk-lib==2.80.0

9.7. Docker image を ECR に配眮する

ハンズオン環境のコンテナにはDockerコマンドが入っおいないので、コンテナむメヌゞを䜜成しおECRぞアップロヌドする手順はハンズオン環境のコンテナをホストしおいる端末偎で行いたす。
~/handson/aws-batch/dockerディレクトリごずSCPを䜿甚しおホスト端末ぞコピヌしおから実行したす。前章で修正したDockerfileを䜿うこずを忘れずに。

9.8. 単䞀のゞョブを実行する

ハンズオン環境ぞはrootナヌザヌでシェルに入っおいるのですが、Jupyter notebookサヌバはセキュリティ察策のためroot暩限による実行をデフォルトでは蚱しおいないのでポヌト8888なので䞀般ナヌザヌ暩限で十分チュヌトリアル通りに起動できたせん。--allow-rootオプションを぀けお起動したす。

# .env の仮想環境にいるこずを確認
(.env) $ cd notebook
(.env) $ jupyter notebook --allow-root 

Jupyter notebookはハンズオンのコンテナ内で皌働しおいるので、WebブラりザからアクセスするためにSSHのポヌトフォワヌドを䜿いたした。
dockerの-pオプションは思ったように動䜜しなかったのでSSHを䜿甚

ハンズオン環境のコンテナを皌働させおいるホスト端末偎にお

$ docker ps
CONTAINER ID   IMAGE    ....
8816a77aadbc   labc_v2  ....

コンテナID指定でハンズオン環境のシェルに入る
$ docker exec -ti 8816a77aadbc bash

ハンズオン環境からホスト端末ぞSSHでポヌトフォワヌド 
root@aws-handson:~$ ssh -R localhost:8931:localhost:8888 (ホスト端末のログむンID)@(ホスト端末のIP)

この状態のたた、ホスト端末䞊でWebブラりザを立ち䞊げおhttp://localhost:8931でJupyter notebookぞ入れたす。

12.1. Lambda ハンズオン

Python 3.7のランタむムはAWSがサポヌト終了したのでこのたたではでdeploy時に゚ラヌで止たりたす。
v3.9で動かすように倉曎しおから実行したす。

app.py を修正

(修正前)
runtime=_lambda.Runtime.PYTHON_3_7

(修正埌)
runtime=_lambda.Runtime.PYTHON_3_9

12.3. S3 ハンズオン

そのたた実行するずdeployで互換性゚ラヌが出るので、cdk libバヌゞョンを䞊げる必芁がありたす。

requirements.txt を修正

(修正前)
aws-cdk-lib==2.70.0

(修正埌)
aws-cdk-lib==2.80.0

13. Hands-on #6: Bashoutter

そのたた実行するずpip install, deploy時に゚ラヌが発生しお止たるので、䞀郚修正したす。
requirements.txt ず app.py を修正したす。

requirements.txt を修正

(修正前)
aws-cdk-lib==2.70.0

(修正埌)
aws-cdk-lib==2.80.0    <-- 修正
urllib3<1.27,>=1.25.4  <-- 远蚘

urllib3<1.27,>=1.25.4はpip install時に発生するラむブラリの互換性゚ラヌ回避のためです。

app.py を修正

(修正前)
website_index_document="index.html",
public_read_access=True,
 
(修正埌)
website_index_document="index.html",
block_public_access=s3.BlockPublicAccess.BLOCK_ACLS,  <-- 远蚘
public_read_access=True,


(修正前)
common_params = {
    "runtime": _lambda.Runtime.PYTHON_3_7,

(修正埌)
common_params = {
    "runtime": _lambda.Runtime.PYTHON_3_9,  <-- 修正

block_public_access=s3.BlockPublicAccess.BLOCK_ACLS,を远蚘する理由は、パプリック公開型のS3を新芏生成する際のセキュリティ仕様倉曎のためです。
最終行の修正 PYTHON_3_9 は、前述した「12.1. Lambda ハンズオン」ず同様にPythonのランタむムバヌゞョンを倉曎する修正です。

泚蚘

ひずたず゚ラヌを出さずに通しで動䜜できる最小限の修正のみやっおたすので、䜜業䞭はそれなりにwarningが出たす。

おわりに

気に入っおいただけたら「いいね」をポチっおいただくず嬉しいです🀗

1074
1362
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1074
1362

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?