IAMロールを活用したAWS CodeDeployによるオンプレミスへの安全なデプロイ方法
はじめに
AWSの提供するデプロイサービスであるCodeDeployは、EC2インスタンスだけでなくオンプレミスインスタンスへのデプロイもサポートしています。しかし、オンプレミスインスタンスへのデプロイを安全に行うためには、適切な認証と権限の設定が必要です。
この記事では、IAMロールを使用してオンプレミス環境に安全にデプロイする方法について解説します。
前提条件
この手順を実行する前に、以下の準備が必要です。
- オンプレミスインスタンスがCodeDeployと通信するためにAWSサービスエンドポイントに接続できること(HTTPS 443ポート)
- オンプレミスインスタンスでsudoあるいはroot権限で操作できること
- オンプレミスインスタンスに以下のソフトウェアがインストールされていること
- Ruby 2.0以上
- AWS SDK for Ruby(aws-sdk-core gem)
- wget
- git
セキュアデプロイのための全体像
オンプレミスインスタンスにCodeDeployを使用してデプロイするための全体的な流れは次の通りです。
- IAMユーザーとIAMロールの作成と設定
- CodeDeployエージェントのインストール
- 一時認証情報の設定
- オンプレミスインスタンスのデプロイグループへの登録
この方法により、長期的な認証情報をオンプレミスインスタンスに保存する必要なく、一時的な認証情報(STS)を使用してデプロイを実行することができます。
IAMユーザーとIAMロールの設定
IAMユーザーの作成
まずはオンプレミスインスタンス用のIAMユーザーを作成します。このユーザーは、IAMロールを引き受ける(AssumeRole)権限のみを持ちます。
マネジメントコンソールでIAMユーザー「OnPremiseInstanceUser」を作成しますが、このとき「AWSマネジメントコンソールへのユーザーアクセスを提供する」のチェックボックスはオフにします。これはプログラムによるアクセスのみを許可するためです。
IAMロールの構成
次に、オンプレミスインスタンスがアーティファクトバケットにアクセスするための権限を持つIAMロールを作成します。
ロールを作成する際に、S3バケットアクセス用のインラインポリシーを直接設定します。インラインポリシーは以下のようになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::<アーティファクトバケット>/*",
"arn:aws:s3:::<アーティファクトバケット>"
]
}
]
}
このロールには信頼ポリシー(信頼関係)も設定します。信頼ポリシーでは、先ほど作成したIAMユーザーのみがこのロールを引き受けられるように設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<AWSアカウントID>:user/OnPremiseInstanceUser"
},
"Action": "sts:AssumeRole"
}
]
}
最後に、IAMユーザーに対してロールを引き受ける権限を付与するインラインポリシーを作成し、IAMユーザーに直接アタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::<AWSアカウントID>:role/OnPremiseInstanceRole"
}
]
}
オンプレミスインスタンスの設定
CodeDeployエージェントのインストール
オンプレミスインスタンスにログインし、CodeDeployエージェントをインストールします。
# インストールスクリプトのダウンロード
$ wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
# インストールスクリプトに実行権限を付与
$ chmod +x ./install
# インストールの実行
$ sudo ./install auto
# エージェントの起動確認
$ sudo service codedeploy-agent status
一時認証情報の設定と更新
オンプレミスインスタンスで一時的な認証情報を取得するために、AWS CodeDeployのセッションヘルパーツールをインストールします。
sudo gem install aws-sdk-core
git clone https://github.com/awslabs/aws-codedeploy-samples.git
cloneしたリポジトリの中にある utilities/aws-codedeploy-session-helper/bin/get_sts_creds
を利用して一時的な認証情報を取得します。適宜パスを通すなどの設定を行ってください。
get_sts_creds --role-arn arn:aws:iam::<AWSアカウントID>:role/OnPremiseInstanceRole --file /home/dev-user/aws-temporary-credentials --print-session-arn
コマンド実行後、セッションARNが表示されます。このARNは後でCodeDeployエージェントの設定に使用します。
認証情報の有効期限はデフォルトで1時間なので、cronを使って定期的に更新するよう設定します。
$ sudo crontab -e
# 以下の行を追加
0,15,30,45 * * * * get_sts_creds --role-arn arn:aws:iam::<AWSアカウントID>:role/OnPremiseInstanceRole --file /home/dev-user/aws-temporary-credentials
CodeDeployエージェントの構成
取得した一時認証情報を使うようにCodeDeployエージェントを設定します。先ほど取得したセッションARNを使って、以下のように設定ファイルを編集します。
---
iam_session_arn: <セッションARN>
aws_credentials_file: /home/dev-user/aws-temporary-credentials
region: ap-northeast-1
この設定ファイルを /etc/codedeploy-agent/conf/codedeploy.onpremises.yml
に保存し、エージェントを再起動します。
sudo service codedeploy-agent restart
デプロイグループへの登録
オンプレミスインスタンスをCodeDeployに登録し、タグを設定します。なお、今回作成したIAMユーザーとIAMロールには権限を付与していないため、以下の操作は管理権限を持つAWSユーザーのプロファイルで実行する必要がある点は注意してください。
aws deploy register-on-premises-instance --instance-name <インスタンス名> --iam-session-arn <セッションARN>
aws deploy add-tags-to-on-premises-instances --instance-names <インスタンス名> --tags Key=IsDeployTarget,Value=true
上記の例では、IsDeployTargetタグを設定していますが、運用に合わせて適切なタグを設定してください。
最後に、マネジメントコンソールからCodeDeployのデプロイグループにこのインスタンスを追加します。タグを使ってインスタンスをフィルタリングすることができます。
デプロイの実行とログの確認
デプロイグループへの登録が完了したら、実際にデプロイを実行してみましょう。デプロイの進行状況はCodeDeployコンソールから確認できます。また、オンプレミスインスタンス上では以下のコマンドでログを確認できます。
sudo tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log
おわりに
この記事では、IAMロールと一時認証情報を使ってオンプレミス環境に安全にデプロイを行う方法について解説しました。この方法によって、以下のメリットが得られます。
- 長期的なアクセスキーをインスタンスに保存する必要がない
- 認証情報が定期的に更新されるため、セキュリティが向上する
- 最小権限の原則に従って、必要な権限のみを付与できる
AWS環境とオンプレミス環境が混在するハイブリッド構成においても、一貫したデプロイプロセスを実現できるCodeDeployは、CI/CDパイプラインの構築に役立つ強力なツールです。