この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
渡辺です。
2017/04/19開催(日本時間:2017/04/20)の『AWS Summit in San Francisco』で発表された新サービス『AWS CodeStar』についてお知らせします。 一言で言えば、CodeCommit, CodePipeline, CodeBuild, CodeDeployとそれらに付随する実行環境を一撃で構築・管理できます(2017年4月の時点で、東京リージョンでは利用できません)。
実行環境もカバーする最強のスキャホールド
AWS CodeStarが何者か、一言で言えば、一時期に流行ったスキャホールドの類です。 Ruby on Railsが登場した時、コマンドひとつでウェブアプリケーションの雛形ができることに衝撃を覚えた人は多いでしょう。 ベース部分をスキャホールド(足組)として作り、肉付けをしていくというスタイルが流行ったかと思います。
AWS CodeStarは開発環境のスキャホールドと言えます。 リポジトリ(CodeCommit)からビルド(CodeBuild)、そしてデプロイ(CodeDeploy)がCodePipelineでシームレスに繋がります。 さらにデプロイするEC2インスタンスやBeanstlak環境も作成します。 開発者は、 最小限の情報を入力することで、AWS上で動くアプリケーション環境と最小限のソースコードを手に入れる ことができます。
やってみた
AWS CodeStarはバージニアリージョンで既に利用できます。
プロジェクトの作成
はじめにプロジェクトを作成します。
プロジェクトは実行環境とアプリケーションのタイプを選択します。 Ruby, Java, Python, NodeJSなど主要なプロダクトタイプが選択できます。 また、実行環境もEC2だけでなくBeanstalkを選択できます。 ここでは静的ウェブサイトを選択してみます。
次にプロジェクト名を設定します。 ここで、AWS CodeStarが作成するリソースが確認できます。 今回、静的Webサイトのプロジェクトなので、Source(CodeCommit)とDeploy(CodeDeploy)のシンプルな構成です。 SpringアプリであればBuildやTestが加わるなどCodePipelineの流れがここで決まります。
今回、実行環境はEC2なのでEC2インスタンスのスペックも設定できます。
なお、現時点では、プロジェクト名は、CodeCommitのリポジトリ名に紐付きます。 testとかいれると重複して作成に失敗するので注意してください。
おしまいです。 これだけでCodeCommit、CodeDeploy、CodePipelineの設定と、アプリケーションを実行するEC2インスタンスが作れてしまいます。
開発環境を整備する
AWS環境の準備はできました。 続けて開発環境を整備します。 開発環境はVisual StudioやEclipseとも連携できるようです。 今回はシンプルにコマンドラインを利用しましょう。
OSや接続方法など選択するとリポジトリとの接続方法を教えてくれます。
シンプルにSSHで接続するには以下のステップを踏みます。
Step 1: Set up Git Step 2: Generate Git credentials Step 3: Clone the repository
詳細は、 CodeCommitのGitリポジトリへの接続方法を参照してください。
早速、ローカル環境にソースをCloneします。
$ git clone ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/hello-website
$ cd hello-website/
$ tree
.
├── appspec.yml
├── scripts
│ ├── install_dependencies
│ ├── start_server
│ └── stop_server
└── webpage
├── css
│ ├── gradients.css
│ └── styles.css
├── img
│ └── tweet.svg
├── index.html
└── js
└── set-background.js
既に良い感じの雛形がコミットされているようです。 appspec.ymlもあるため、CodeDeployを利用する準備も完了していますね。
最初のアプリケーション
AWS CodeStarはGit(CodeCommit)にPushすれば、勝手にCIが回ります。 初期段階で、既にアプリはデプロイされているので確認してみましょう。 ダッシュボードをみれば、現在の進捗を確認出来ます。
あれ、デプロイ失敗?
現状、EC2へのデプロイが成功しません。 cloud-initの処理がうまく動かず、CodeDeploy agentが起動していないのが原因です。 UserDataセクションにあるコマンドをSSHログインして手動実行してください。
#!/bin/bash -ex
wget -O /usr/local/bin/get_authorized_keys https://s3.amazonaws.com/awscodestar-remote-access-us-east-1/get_authorized_keys
chmod 755 /usr/local/bin/get_authorized_keys
sed -i '/AuthorizedKeysCommand /s/.*/AuthorizedKeysCommand \/usr\/local\/bin\/get_authorized_keys/g' /etc/ssh/sshd_config
sed -i '/AuthorizedKeysCommandUser /s/.*/AuthorizedKeysCommandUser root/g' /etc/ssh/sshd_config
/etc/init.d/sshd restart
yum update -y aws-cfn-bootstrap
yum install -y aws-cli
# Install the AWS CodeDeploy Agent.
cd /home/ec2-user/
wget https://aws-codedeploy-us-east-1.s3.amazonaws.com/latest/codedeploy-agent.noarch.rpm
yum -y install codedeploy-agent.noarch.rpm
# Install pip and python dev libraries.
yum install -y python27-devel python27-pip gcc
pip install boto3
pip install pycrypto
本来はこの処理はEC2インスタンス起動時に実行されます。
デプロイを再試行してみます。
デプロイ完了後、EC2インスタンスのIPアドレスにブラウザでアクセスすれば、次のように静的ウェブサイトが表示されるでしょう。
最初の継続的インテグレーション
さて、ここからがCI(継続的インテグレーション)の真骨頂です。 ローカルにcloneした、ソースを(webpage/index.html)変更しましょう。 適当にエディタで編集したならば、GitでPushしてください。
$ git commit .
[master 2dac787] CIテスト
1 file changed, 2 insertions(+), 2 deletions(-)
$ git push
Warning: Permanently added 'git-codecommit.us-east-1.amazonaws.com,72.21.203.185' (RSA) to the list of known hosts.
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
To ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/hello-website
9a9ea18..2dac787 master -> master
後は珈琲でも飲みながらお任せです。 CodeCommitにPushされた変更はCodePipelineで検知され、CodeDeployでデプロイされるのです。
終わったならばサイトをリロードします。
ローカルで変更し、GitにPushしただけで全自動リリースされました!
まとめ
AWS CodeStarを使うことで、CI環境だけでなく実行環境も含めて一撃で作ることができます。 これは開発段階のプロダクトでは本当に助かります。 開発者はローカルで変更してGitにPushすれば、AWS環境で動作確認ができるのです。
もちろん、CIを本番環境に適用する場合はテストをどうするのかなど課題もあります。 しかし、とりあえずアプリを作って公開したいというユースケースでは 最強最速のサービス と言えます。