質問
· 2021年5月18日

AWS CodeBuildを用いた自動ビルドの仕組みについて。

こんにちは、皆さま。
業務でIRISを用いて開発を行っている者です。

AWSのcodebuildを利用して、
IRIS環境をビルドされた経験がある方がいらっしゃたら
情報共有いただきたいです。

 

ただいま取り組んでいるプロジェクトでは、
IRISのclsファイルをaws codecommitのgitリポジトリで管理しております。
※Dockerコンテナではない。

ここで作成されたソースコードをaws Codebuildの仕組みを利用して
自動でコンパイルチェックをする仕組みを構築したいと考えております。
コンパイルを実行する環境としては、AWS ECRに自作したDockerコンテナを利用しております。
※コンテナはstore/intersystems/iris-community:2020.1.0.215.0を基底に、簡単なネームスペースを作成しただけのもの。
 ローカルPC上ではIRIS環境として利用できることを確認済み。

ビルドはbuildspec.ymlにて、以下のような命令で行おうと考えております。

1. iris start IRIS でirisを起動。
2. iris terminal IRISでターミナルにログイン。
3. gitから取得したコードをImport & コンパイル。

しかし、上記を実行しようとすると2の時点で Access Deniedのエラーとなってしまいます。

whoamiでユーザ状態を見てみると、rootになっており、
irisownerではないためそれが原因かと考えておりますが、
su irisownerを実行してもユーザが切り替えられず、手詰まり状態です。

 

①そもそもcodebuildを利用する方針として、上記のやり方は正しいのでしょうか?
②正しい場合、iris terminalに入るために何かいい方法はないでしょうか?

長文となり恐縮ですが、ご意見いただければ幸いです。

Product version: IRIS 2020.1
ディスカッション (5)2
続けるにはログインするか新規登録を行ってください

自己解決しました! 以下のように実行することで、irisownerのユーザでIRIS内の命令を直接実行できるようになりました。

su - irisowner -c "iris terminal IRIS \"##CLASS(%SYSTEM.OBJ).ImportDir(\\\"参照パス\\\",\\\"*.cls;*.mac;*.int;*.inc;*.dfi\\\",\\\"ck\\\",,1)\" "

一旦問題は解消されたので課題は閉じさせていただこうと思うのですが、 Codebuildの使い方について他にベストプラクティス等あれば 情報いただけますと幸いです。

Ohataさん、情報共有ありがとうございます。

Codebuild固有の、という事ではないのですが、IRISのイメージは
https://docs.docker.com/develop/develop-images/dockerfile_best-practices...
こちらに従い、ビルド時のUSERはirisownerになっています。

$ docker history containers.intersystems.com/intersystems/iris:2020.1.0.215.0 | grep USER
<missing>      13 months ago   /bin/sh -c #(nop)  USER irisowner               0B

ですので、そのまま実行した場合は

$ docker run --rm -it --entrypoint whoami store/intersystems/iris-community:2020.1.0.215.0
irisowner

となります。
Dockerfile内にて、パッケージマネージャ(apt)の使用などのために

USER root

を実行されておられませんでしょうか?その場合、可能な限りは、最終的には

USER ${ISC_PACKAGE_MGRUSER}

(ISC_PACKAGE_MGRUSERの内容はirisownerです)
を実行しておくことをお勧めいたします。この方法でビルドされたイメージはsu -irisownerなしで、IRISにO/S認証でのログインが可能になります。下記は使用例です。

https://github.com/intersystems-community/objectscript-docker-template/b...

もし、なんらかの理由で実行時にrootによるアクセスが必要になる場合は、Docker CLIであれば下記が使用できます。

$ docker exec -ti -u root containerId whoami
root

Iwamoto さん

ご連絡いただきありがとうございます。
docker起動時にユーザ指定できるのは知りませんでした!
まだまだいろいろなことができそうなので、こちらでも触ってみるようにします。

方法を紹介しておいて、何なのですが...こちらの記事に書いたのですが、Kubernetesの同類のコマンドであるkubectl execには、(今のところ?)このユーザ指定の機能がありません。ブログで見かけるようなdockerのCLI経由でのアクセスも、V1.23以降はできなくなる(Kubernetesでのdocker使用が廃止される)そうなので、もし、将来、運用もコンテナで...という事をお考えでしたら、あまりこの機能に依存しすぎるのは避けておいたほうが無難かもしれません。

CircleCI,Gitlab, GitHub Actionsあたりは例があるのですが、AWS CodeBuildはなぜか見かけません。
YAMLを共有いだだければ、いろんなアイデアが集まるかもしれませんよ?wink
 

解決策に書いた以上のことはあまり何もしてないのですが、
buildspec.ymlの内容を転記させていただきます。cheeky

  build:
    commands:
      - mkdir -p /user/local/work
      - cd ..
      - mv * /user/local/work
      - cd /user/local/work
      - chmod -R 777 /user/local/work
      - iris start IRIS
      - su - irisowner -c "iris terminal IRIS \"##CLASS(%SYSTEM.OBJ).ImportDir(\\\"/user/local/work\\\",\\\"*.cls;*.mac;*.int;*.inc;*.dfi\\\",\\\"ck\\\",,1)\" " | tee result.txt
      - find result.txt | xargs grep -n "error" | wc -l
      - |
         if find result.txt | xargs grep -n "error" | wc -l >0; then
             false;
         fi