AWS Certificate Manager(ACM) がApacheに対応したので使ってみたがvCPUが減ったのでびっくりした話


## 概要
Sep 14, 2022にAWS Certificate Manager （ACM）がApacheに対応したとのことで、
通常であればALBにACMを設定して運用するため、あまり使わないだろうなぁっと思っていたが、
どうしても使わないと行けない機会があったので使いました。

[AWS Certificate Manager (ACM) for Nitro Enclaves が Apache HTTP ウェブサーバーのサポートを開始
](https://aws.amazon.com/jp/about-aws/whats-new/2022/09/aws-certificate-manager-nitro-enclaves-supports-apache-http-webservers/)


## 設定手順

公式の設定手順はこちらにあります。

設定自体はコマンドレベルで記載があるので作業はできると思いますが、
ACMやロールの概念を理解していないと、何をしているの？っというのは理解するのは結構たいへんだと思います。
本記事では、内容は割愛させていただきます。

[Nitro Enclaves application: AWS Certificate Manager for Nitro Enclaves
](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html)

## 使用してみてアレ？って思った点

今回作成したインスタンスは c5.xlarge (4vCPU)ですが
htopの結果が2コアしかありません。

![スクリーンショット 2023-03-29 11.34.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/cb6c6931-0269-cb3a-b0e6-bfa1d45a5f97.png)

またcpuinfonも2コアしか有効になっておりません。

![cpuinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/696c88db-72b8-215c-96de-22c8000b11d3.png)

原因についてサポートにも確認して原因追求をしました。

##　結論

この表記、挙動で問題ないようです。

nitoroインスタンスは　`Nitro Enclaves` をというものを使用しています。
上記の手順の中でも

`sudo systemctl restart nitro-enclaves-acm.service` というコマンドを実行しています。

※おそらくこのなかでnitro-enclaves-allocatorが実行されていると思われます。

このnitro-enclaves-acmの中に読まれる定義ファイルで
`/etc/nitro_enclaves/allocator.yaml`　というファイルを参照していますが
ここでCPUの利用数を制限しています。

```
---
# Enclave configuration file.
#
# How much memory to allocate for enclaves (in MiB).
memory_mib: 512
#
# How many CPUs to reserve for enclaves.
cpu_count: 2
#
# Alternatively, the exact CPUs to be reserved for the enclave can be explicitely
# configured by using `cpu_pool` (like below), instead of `cpu_count`.
# Note: cpu_count and cpu_pool conflict with each other. Only use exactly one of them.
# Example of reserving CPUs 2, 3, and 6 through 9:
# cpu_pool: 2,3,6-9
```

説明では、


> Nitro Enclaves は、最も機密性の高いデータを処理するアプリケーションにおいて、お客様が攻撃対象領域を削減するのに役立ちます。
> Enclaves は、重要機密を扱うアプリケーションをホストするための、強力かつ分離され、高度な強制力を持つ環境を提供します。

[AWS 公式 AWS Nitro Enclaves 説明](https://aws.amazon.com/jp/ec2/nitro/nitro-enclaves/#:~:text=Nitro%20Enclaves%20%E3%81%AF%E3%80%81%E6%9C%80%E3%82%82%E6%A9%9F%E5%AF%86,%E7%92%B0%E5%A2%83%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82
)

と記載されており。dockerやVMのように一部の特殊な領域を確保する必要があり、nitro_enclaves自体が動くために
その領域のデフォルト値をmemory:512MB CPU:2 コア　として確保しているんだろうとの理解をしました。


## 公式サポートからの回答

サポートにも確認したところ、以下回答を頂きました。
※AWSサポートさんには迅速にご回答いただきいつも感謝です

```
結論から申し上げますと、vCPU の数が 2 と表示された理由(vCPUの1,3が機能していないようにみられた理由) は nitro-enclaves-allocator.service により vCPU が予約されたためでございます。

なお、cpu_count パラメーターは、Enclaves に割り当てる vCPU の数を指定するものとなります。
4コアの vCPU のインスタンスの場合、親インスタンス側と Enclaves 側でそれぞれ vCPU が必要となりますため、この場合 4 つを Enclaves に割り当てることはできません。

またこの場合、nitro-enclaves-allocator.service が起動できておらず、Enclaves 側は vCPU が 0 (割り当てられていない) であるため Enclaves をご利用いただけない状態となります。

従いまして、c5.xlarge (4コアのvCPUのインスタンス) をご利用の際は、/etc/nitro_enclaves/allocator.yaml の cpu_count に設定する vCPU の数は 2 として設定いただくようお願いいたします。

もし親インスタンス側で vCPU の数が必要でございましたら、より大きなインスタンスタイプ(c5.2xlarge等)をご利用いただけますようお願い申し上げます。
```

とのことで、インスタンスとしてのvCPUは２コア表記は正しく、問題の無い挙動とのことです。


最初見たときはびっくりしましたが、/var/log/messageや、allocator.yamlを確認したりするのは
とても勉強になりました。
自分のように疑問を思うかたがおられると思うのでブログ化しておこうと思った次第でございます。
参考になれば幸いです。

それではよいAWSライフを！