【CodeDeploy】デプロイグループにオンプレミスインスタンス登録をしてみた。

2022.01.21

こんにちは、AWS事業本部コンサルティング部のたかくにです。

今回は、以下のドキュメントを基に、オンプレミスインスタンスをCodeDeployのデプロイグループ配下に登録してみようと思います。

register-on-premises-instance コマンド (IAM ユーザー ARN) を使用してオンプレミスインスタンスを登録する

構成図

EC2インスタンスをオンプレミスサーバーに見立ててデプロイグループに登録してみようと思います。 パブリックサブネットにインスタンスを配置しているため今回はインターネット経由でAPIを実行します。

使用するOSについて

今回、OSは「Ubuntu Server 20.04 LTS」を使用します。 CodeDeployエージェントのサポートされるOSバージョンには注意が必要です。

CodeDeploy エージェントでサポートされるオペレーティングシステム

ステップ 1: オンプレミスインスタンスのIAM ユーザーを作成する

オンプレミスインスタンス用にIAMユーザーを作成します。

作成するIAMユーザーはオンプレミスインスタンスと1対1である必要があります。
多くのインスタンスをデプロイグループに登録する際は、IAMロールを使用した登録方法をご検討ください。

作成するIAMユーザーはマネジメントコンソールへのアクセスは必要ないため、「アクセスキー - プログラムによるアクセス」で作成します。

ステップ 2: IAM ユーザーにアクセス許可を割り当てる

アプリケーションリビジョンがS3バケットに格納されている場合は、S3へアクセス権限が必要です。今回は、以下の権限を付与しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

参考:送信元IPに基づいてAWSへのアクセスを拒否する

ステップ1でアクセスキーを発行しています。アクセスキーが流出すると、該当S3バケットへ不正アクセスされます。 そこで、APIが実行可能なIPアドレスを制限しました。

AWS: 送信元 IP に基づいて AWS へのアクセスを拒否する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "123.456.789.123/32"
                },
                "Bool": {
                    "aws:ViaAWSService": "false"
                }
            }
        }
    ]
}

ステップ 3: オンプレミスインスタンスに設定ファイルを追加します。

オンプレミスインスタンスにステップ1で用意した認証情報を設定します。 OSごとに設定ファイルのパスやファイル名が異なります。

今回、「Ubuntu」を使用しているため、/etc/codedeploy-agent/conf/codedeploy.onpremises.ymlで作成していますが、詳細は以下をご参照ください。

ステップ 4: オンプレミスインスタンスに設定ファイルを追加します。

/etc/codedeploy-agent/conf/codedeploy.onpremises.ymlの内容

---
aws_access_key_id: アクセスキー
aws_secret_access_key: シークレットアクセスキー
iam_user_arn: ステップ1で作成したIAMユーザー
region: デプロイグループが存在するリージョン

ステップ 4: AWS CLIのインストールと設定

AWS CLIがインストールされていないOSの場合は以下を参照してAWS CLIをインストールします。

Installing or updating the latest version of the AWS CLI

Ubuntuの場合

sudo apt-get install zip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

ステップ 5: AWS_REGION 環境変数を設定します (Ubuntu Server および RHEL のみ)

CodeDeployエージェントを自動更新するためにAWS_REGION環境変数をCodeDeployがサポートしているリージョンの識別子に設定します。

export AWS_REGION=デプロイグループが存在するリージョン

ステップ 6: CodeDeploy エージェントのインストール

CodeDeploy エージェントを実際にインストールします。 OSごとにインストール方法が違いますのでリファレンスを参照ください。

ステップ 7: CodeDeploy エージェントのインストール

私の場合は、ステップ5で環境変数を設定していたため環境変数を参照するように変更しました。

sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
wget https://aws-codedeploy-${AWS_REGION}.s3.${AWS_REGION}.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto > /tmp/logfile
sudo service codedeploy-agent status

ステータスが「running」になっていれば、OKです。

オンプレミスインスタンス側の設定は以上です。

ステップ 7: オンプレミスインスタンスを登録

ここからは、AWS側からの設定です。

CloudShellまたは、CodeDeployを設定可能な権限が付与された端末でオンプレミスインスタンスの紐付けを行います。 インスタンス名は、一意であることが推奨されています。

aws deploy register-on-premises-instance --instance-name インスタンスの名前(今回はOnPremiseInstanceで設定) --iam-user-arn arn:aws:iam::アカウントID:user/ステップ1のユーザー名

マネジメントコンソール上に登録されたインスタンスが表示されていれば完了です。

まとめ

今回はCodeDeploy エージェントを使用してデプロイグループへオンプレミスインスタンスを登録してみました。

OSのバージョンやIAMユーザーの制約など条件はありますが画期的な機能だと思います。

この記事が参考になれば幸いです。AWS事業本部コンサルティング部のたかくにでした!