mirror of
https://github.com/davegallant/davegallant.github.io.git
synced 2025-10-06 09:26:02 +00:00
Compare commits
6 Commits
38cb4d00a8
...
2f715c4b27
Author | SHA1 | Date | |
---|---|---|---|
|
2f715c4b27 | ||
|
d839024d95 | ||
|
f9ee17986d | ||
|
953cf64989 | ||
|
c59415d6b3 | ||
|
f8d313309a |
92
content/blog/amazon-ebs-csi-driver-terraform/index.md
Normal file
92
content/blog/amazon-ebs-csi-driver-terraform/index.md
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
---
|
||||||
|
title: "Amazon EBS CSI driver with terraform"
|
||||||
|
date: "2024-04-07T15:20:23-04:00"
|
||||||
|
draft: false
|
||||||
|
comments: true
|
||||||
|
toc: false
|
||||||
|
author: "Dave Gallant"
|
||||||
|
tags: ['aws', 'eks', 'ebs', 'aws-ebs-csi-driver', 'oidc']
|
||||||
|
---
|
||||||
|
|
||||||
|
I recently configured the Amazon EBS CSI driver and found the setup with terraform to be more effort than expected. I wanted to avoid third-party modules and keep it as simple as possible, while remaining least privilege.
|
||||||
|
|
||||||
|
<!--more-->
|
||||||
|
|
||||||
|
The [Amazon EBS CSI driver docs](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html) mention that the following are needed:
|
||||||
|
- an existing EKS cluster
|
||||||
|
- IAM role (that allows communication to the EC2 API)
|
||||||
|
- EKS add-on (aws-ebs-csi-driver)
|
||||||
|
- OIDC provider
|
||||||
|
|
||||||
|
This sounded simple enough but I was unable to find a "grab-and-go" terraform example that followed the recommendations in the docs. I saw some suggestions about attaching an `AmazonEBSCSIDriverPolicy` policy to the node groups but did not think this was the best idea since this would allow many pods to potentially have access to the EC2 API.
|
||||||
|
|
||||||
|
After a few minutes of LLM prompting, I was unimpressed with the results. I began to piece together the config myself, and after some trial and error, this is the terraform that I came up with:
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
|
||||||
|
# TLS needed for the thumbprint
|
||||||
|
provider "tls" {}
|
||||||
|
|
||||||
|
data "tls_certificate" "oidc" {
|
||||||
|
url = aws_eks_cluster.main.identity[0].oidc[0].issuer
|
||||||
|
}
|
||||||
|
|
||||||
|
# EKS addon
|
||||||
|
resource "aws_eks_addon" "ebs_csi_driver" {
|
||||||
|
cluster_name = aws_eks_cluster.main.name
|
||||||
|
addon_name = "aws-ebs-csi-driver"
|
||||||
|
addon_version = "v1.29.1-eksbuild.1"
|
||||||
|
service_account_role_arn = aws_iam_role.ebs_csi_driver.arn
|
||||||
|
}
|
||||||
|
|
||||||
|
# AWS Identity and Access Management (IAM) OpenID Connect (OIDC) provider
|
||||||
|
|
||||||
|
resource "aws_iam_openid_connect_provider" "eks" {
|
||||||
|
url = aws_eks_cluster.main.identity.0.oidc.0.issuer
|
||||||
|
client_id_list = ["sts.amazonaws.com"]
|
||||||
|
thumbprint_list = [data.tls_certificate.oidc.certificates[0].sha1_fingerprint]
|
||||||
|
}
|
||||||
|
|
||||||
|
# IAM
|
||||||
|
resource "aws_iam_role" "ebs_csi_driver" {
|
||||||
|
name = "${var.environment_name}-ebs-csi-driver"
|
||||||
|
assume_role_policy = data.aws_iam_policy_document.ebs_csi_driver_assume_role.json
|
||||||
|
}
|
||||||
|
|
||||||
|
data "aws_iam_policy_document" "ebs_csi_driver_assume_role" {
|
||||||
|
statement {
|
||||||
|
effect = "Allow"
|
||||||
|
|
||||||
|
principals {
|
||||||
|
type = "Federated"
|
||||||
|
identifiers = [aws_iam_openid_connect_provider.eks.arn]
|
||||||
|
}
|
||||||
|
|
||||||
|
actions = [
|
||||||
|
"sts:AssumeRoleWithWebIdentity",
|
||||||
|
]
|
||||||
|
|
||||||
|
condition {
|
||||||
|
test = "StringEquals"
|
||||||
|
variable = "${aws_iam_openid_connect_provider.eks.url}:aud"
|
||||||
|
values = ["sts.amazonaws.com"]
|
||||||
|
}
|
||||||
|
|
||||||
|
condition {
|
||||||
|
test = "StringEquals"
|
||||||
|
variable = "${aws_iam_openid_connect_provider.eks.url}:sub"
|
||||||
|
values = ["system:serviceaccount:kube-system:ebs-csi-controller-sa"]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_iam_role_policy_attachment" "AmazonEBSCSIDriverPolicy" {
|
||||||
|
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy"
|
||||||
|
role = aws_iam_role.ebs_csi_driver.name
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above configuration follows the docs, binding an IAM role to the service account _kube-system/ebs-csi-controller-sa_ using an OpenID connect provider.
|
||||||
|
|
||||||
|
After applying the changes above, I deployed [the sample application](https://docs.aws.amazon.com/eks/latest/userguide/ebs-sample-app.html) and noticed that the persistent volume claims were bound to EBS volumes.
|
@@ -12,6 +12,8 @@
|
|||||||
{{- $utterancesEnabled := $config.utterances.enable -}}
|
{{- $utterancesEnabled := $config.utterances.enable -}}
|
||||||
|
|
||||||
{{- if $utterancesEnabled -}}
|
{{- if $utterancesEnabled -}}
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
<section id='comments' class='comments'>
|
<section id='comments' class='comments'>
|
||||||
<div class='container sep-before'>
|
<div class='container sep-before'>
|
||||||
<div class='comments'>
|
<div class='comments'>
|
||||||
|
37
package-lock.json
generated
37
package-lock.json
generated
@@ -1101,10 +1101,32 @@
|
|||||||
"postcss": "^8.4"
|
"postcss": "^8.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@csstools/selector-resolve-nested": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==",
|
||||||
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/csstools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/csstools"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^14 || ^16 || >=18"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"postcss-selector-parser": "^6.0.13"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@csstools/selector-specificity": {
|
"node_modules/@csstools/selector-specificity": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz",
|
||||||
"integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
|
"integrity": "sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -4816,9 +4838,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss-nesting": {
|
"node_modules/postcss-nesting": {
|
||||||
"version": "12.0.2",
|
"version": "12.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.1.tgz",
|
||||||
"integrity": "sha512-63PpJHSeNs93S3ZUIyi+7kKx4JqOIEJ6QYtG3x+0qA4J03+4n0iwsyA1GAHyWxsHYljQS4/4ZK1o2sMi70b5wQ==",
|
"integrity": "sha512-qc74KvIAQNa5ujZKG1UV286dhaDW6basbUy2i9AzNU/T8C9hpvGu9NZzm1SfePe2yP7sPYgpA8d4sPVopn2Hhw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -4831,7 +4853,8 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@csstools/selector-specificity": "^3.0.1",
|
"@csstools/selector-resolve-nested": "^1.1.0",
|
||||||
|
"@csstools/selector-specificity": "^3.0.3",
|
||||||
"postcss-selector-parser": "^6.0.13"
|
"postcss-selector-parser": "^6.0.13"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
--bg4: #32344a;
|
--bg4: #32344a;
|
||||||
--fg: var(--fg1);
|
--fg: var(--fg1);
|
||||||
--fg0: #ad8ee6;
|
--fg0: #ad8ee6;
|
||||||
--fg1: #acb0d0;
|
--fg1: #dddfeb;
|
||||||
--fg2: #7da6ff;
|
--fg2: #7da6ff;
|
||||||
--fg3: #9ece6a;
|
--fg3: #9ece6a;
|
||||||
--fg4: #32344a;
|
--fg4: #32344a;
|
||||||
|
@@ -28,32 +28,13 @@ function setCommentsTheme(theme) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setTheme(theme) {
|
function setTheme(theme) {
|
||||||
if (theme == "auto") {
|
|
||||||
theme = window.matchMedia("(prefers-color-scheme: light)").matches
|
|
||||||
? "light"
|
|
||||||
: "dark";
|
|
||||||
}
|
|
||||||
document.documentElement.setAttribute("data-theme", theme);
|
document.documentElement.setAttribute("data-theme", theme);
|
||||||
setPrismTheme(theme);
|
setPrismTheme(theme);
|
||||||
setCommentsTheme(theme);
|
setCommentsTheme(theme);
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleTheme(e) {
|
|
||||||
const theme = e.currentTarget.classList.contains("light--hidden")
|
|
||||||
? "light"
|
|
||||||
: "dark";
|
|
||||||
setTheme(theme);
|
|
||||||
saveTheme(theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initial load
|
setTheme("dark");
|
||||||
setTheme(getTheme());
|
|
||||||
|
|
||||||
window
|
|
||||||
.matchMedia("(prefers-color-scheme: dark)")
|
|
||||||
.addEventListener("change", (event) => {
|
|
||||||
setTheme(getTheme());
|
|
||||||
});
|
|
||||||
|
|
||||||
// This script is inlined in the <head> of the document, so we have to wait
|
// This script is inlined in the <head> of the document, so we have to wait
|
||||||
// for the DOM content before can add event listeners to the toggle buttons
|
// for the DOM content before can add event listeners to the toggle buttons
|
||||||
|
59
themes/hugo-theme-gruvbox/package-lock.json
generated
59
themes/hugo-theme-gruvbox/package-lock.json
generated
@@ -1102,10 +1102,32 @@
|
|||||||
"postcss": "^8.4"
|
"postcss": "^8.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@csstools/selector-resolve-nested": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==",
|
||||||
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/csstools"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/csstools"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^14 || ^16 || >=18"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"postcss-selector-parser": "^6.0.13"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@csstools/selector-specificity": {
|
"node_modules/@csstools/selector-specificity": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz",
|
||||||
"integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
|
"integrity": "sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5053,9 +5075,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss-nesting": {
|
"node_modules/postcss-nesting": {
|
||||||
"version": "12.0.2",
|
"version": "12.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.1.tgz",
|
||||||
"integrity": "sha512-63PpJHSeNs93S3ZUIyi+7kKx4JqOIEJ6QYtG3x+0qA4J03+4n0iwsyA1GAHyWxsHYljQS4/4ZK1o2sMi70b5wQ==",
|
"integrity": "sha512-qc74KvIAQNa5ujZKG1UV286dhaDW6basbUy2i9AzNU/T8C9hpvGu9NZzm1SfePe2yP7sPYgpA8d4sPVopn2Hhw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5068,7 +5090,8 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@csstools/selector-specificity": "^3.0.1",
|
"@csstools/selector-resolve-nested": "^1.1.0",
|
||||||
|
"@csstools/selector-specificity": "^3.0.3",
|
||||||
"postcss-selector-parser": "^6.0.13"
|
"postcss-selector-parser": "^6.0.13"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -7398,10 +7421,17 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
|
"@csstools/selector-resolve-nested": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {}
|
||||||
|
},
|
||||||
"@csstools/selector-specificity": {
|
"@csstools/selector-specificity": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz",
|
||||||
"integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
|
"integrity": "sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
@@ -9938,12 +9968,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"postcss-nesting": {
|
"postcss-nesting": {
|
||||||
"version": "12.0.2",
|
"version": "12.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.1.tgz",
|
||||||
"integrity": "sha512-63PpJHSeNs93S3ZUIyi+7kKx4JqOIEJ6QYtG3x+0qA4J03+4n0iwsyA1GAHyWxsHYljQS4/4ZK1o2sMi70b5wQ==",
|
"integrity": "sha512-qc74KvIAQNa5ujZKG1UV286dhaDW6basbUy2i9AzNU/T8C9hpvGu9NZzm1SfePe2yP7sPYgpA8d4sPVopn2Hhw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@csstools/selector-specificity": "^3.0.1",
|
"@csstools/selector-resolve-nested": "^1.1.0",
|
||||||
|
"@csstools/selector-specificity": "^3.0.3",
|
||||||
"postcss-selector-parser": "^6.0.13"
|
"postcss-selector-parser": "^6.0.13"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user