Amplify + React/Redux アプリ開発 ~ ビルドイメージの作成 ~

October 05, 2020

前回のあらすじ

前回 は Amplify + React/Redux で簡単なアプリを制作しました。
ただ、Python で Lambda を書いている場合に、Amplify Console でデフォルトで用意されるビルドイメージとの互換性 (Python 3.8.x / pipenv が無い) という問題により、amplify.yml を編集してビルドしてました。
これだと毎回 Python と pipenv のインストールが走ってビルドに時間がかかるので、今回はこれらがインストールされたビルドイメージを作成します。

ビルドイメージの作成

Amazon Linux のコンテナイメージは以下のように公開されています。

$ docker search amazonlinux | head -2  
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED  
amazonlinux                            Amazon Linux provides a stable, secure, and …   900                 [OK]   

これを pull して Python と pipenv インストールすれば良いので、以下のような Dockerfile を用意します。

Dockerfile
FROM amazonlinux:latest  
  
RUN export BASE_PATH=$(pwd)  
  
# Install required packages  
RUN yum install -y openssh git make gzip tar wget gcc openssl-devel bzip2-devel libffi-devel python3.8-pip  
  
# Install Python 3.8.2 and pipenv  
RUN cd /opt && wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz  
RUN cd /opt && tar xzf Python-3.8.2.tgz   
RUN cd /opt/Python-3.8.2 && ./configure --enable-optimizations  
RUN cd /opt/Python-3.8.2 && make altinstall  
RUN pip3.8 install pipenv  
RUN ln -fs /usr/local/bin/python3.8 /usr/bin/python3  
RUN ln -fs /usr/local/bin/pip3.8 /usr/bin/pip3  
  
# Install node and npm  
RUN curl -sL https://rpm.nodesource.com/setup_14.x | bash  
RUN yum install --enablerepo=nodesource nodejs -y  
  
RUN cd $BASE_PATH  

で、ビルドしましょう。

$ docker build -t upincore/al2amplifypython ./   
  
...  
  
Successfully built 9f4caa0a8d81  
Successfully tagged upincore/al2amplifypython:latest  
  
$ docker image ls upincore/al2amplifypython   
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE  
upincore/al2amplifypython   latest              9f4caa0a8d81        3 minutes ago       1.5GB  

イメージが作成されてますね。
あとは push しましょう。

$ docker login  
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.  
Username: upincore  
Password:   
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.  
Configure a credential helper to remove this warning. See  
https://docs.docker.com/engine/reference/commandline/login/#credentials-store  
  
Login Succeeded  
  
$ docker push upincore/al2amplifypython   
The push refers to repository [docker.io/upincore/al2amplifypython]  
cef2ef5b7911: Pushed   
010fac06398f: Pushed   
9a4cd49c2604: Pushed   
a1030244041b: Pushed   
45d70711cd49: Pushed   
50a821f2b209: Pushed   
4c9435abdfbe: Pushed   
6957226c7a63: Pushed   
a92b95448246: Pushed   
3c98639de2ec: Pushed   
50c3cd231426: Layer already exists   
latest: digest: sha256:31717a36b5afbcaf69ca207b1004337071d9d6ea2bdd68a95aedd2855828704e size: 2638  

Amplify Console でビルドイメージを指定する

イメージの push が完了したら、あとはそのイメージを Amplify Console 側でビルドイメージとして指定します。ついでに amplify.yml で backend の preBuild phase を削除します。

f:id:shiro_kochi:2018××××××××:plain:w100:left

折角なのでバックエンド API から返却される文字列を多少変更してみました。あとは GitHub にプッシュするだけです。

$ git add .  
$ git commit -m "Changed the message"   
[main 26a2a42] Changed the message  
 1 file changed, 1 insertion(+), 1 deletion(-)  
$ git push  

f:id:shiro_kochi:2018××××××××:plain:w100:left


 © 2023, Dealing with Ambiguity