create-amis: allow customizing the service role name
The complete setup on the AWS end can be configured
with the following Terraform configuration. It generates
a ./credentials.sh which I just copy/pasted in to the
create-amis.sh script near the top. Note: the entire stack
of users and bucket can be destroyed at the end of the
import.
variable "region" {
type = string
}
variable "availability_zone" {
type = string
}
provider "aws" {
region = var.region
}
resource "aws_s3_bucket" "nixos-amis" {
bucket_prefix = "nixos-amis-"
lifecycle_rule {
enabled = true
abort_incomplete_multipart_upload_days = 1
expiration {
days = 7
}
}
}
resource "local_file" "credential-file" {
file_permission = "0700"
filename = "${path.module}/credentials.sh"
sensitive_content = <<SCRIPT
export service_role_name="${aws_iam_role.vmimport.name}"
export bucket="${aws_s3_bucket.nixos-amis.bucket}"
export AWS_ACCESS_KEY_ID="${aws_iam_access_key.uploader.id}"
export AWS_SECRET_ACCESS_KEY="${aws_iam_access_key.uploader.secret}"
SCRIPT
}
# The following resources are for the *uploader*
resource "aws_iam_user" "uploader" {
name = "nixos-amis-uploader"
}
resource "aws_iam_access_key" "uploader" {
user = aws_iam_user.uploader.name
}
resource "aws_iam_user_policy" "upload-to-nixos-amis" {
user = aws_iam_user.uploader.name
policy = data.aws_iam_policy_document.upload-policy-document.json
}
data "aws_iam_policy_document" "upload-policy-document" {
statement {
effect = "Allow"
actions = [
"s3:ListBucket",
"s3:GetBucketLocation",
]
resources = [
aws_s3_bucket.nixos-amis.arn
]
}
statement {
effect = "Allow"
actions = [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
]
resources = [
"${aws_s3_bucket.nixos-amis.arn}/*"
]
}
statement {
effect = "Allow"
actions = [
"ec2:ImportSnapshot",
"ec2:DescribeImportSnapshotTasks",
"ec2:DescribeImportSnapshotTasks",
"ec2:RegisterImage",
"ec2:DescribeImages"
]
resources = [
"*"
]
}
}
# The following resources are for the *vmimport service user*
# See: https://docs.aws.amazon.com/vm-import/latest/userguide/vmie_prereqs.html#vmimport-role
resource "aws_iam_role" "vmimport" {
assume_role_policy = data.aws_iam_policy_document.vmimport-trust.json
}
resource "aws_iam_role_policy" "vmimport-access" {
role = aws_iam_role.vmimport.id
policy = data.aws_iam_policy_document.vmimport-access.json
}
data "aws_iam_policy_document" "vmimport-access" {
statement {
effect = "Allow"
actions = [
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
]
resources = [
aws_s3_bucket.nixos-amis.arn,
"${aws_s3_bucket.nixos-amis.arn}/*"
]
}
statement {
effect = "Allow"
actions = [
"ec2:ModifySnapshotAttribute",
"ec2:CopySnapshot",
"ec2:RegisterImage",
"ec2:Describe*"
]
resources = [
"*"
]
}
}
data "aws_iam_policy_document" "vmimport-trust" {
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = [ "vmie.amazonaws.com" ]
}
actions = [
"sts:AssumeRole"
]
condition {
test = "StringEquals"
variable = "sts:ExternalId"
values = [ "vmimport" ]
}
}
}
This commit is contained in:
parent
e253de8a77
commit
2bf1fc0345
@ -6,9 +6,10 @@
|
|||||||
# <nixos/release.nix> amazonImage attribute. Images are uploaded and
|
# <nixos/release.nix> amazonImage attribute. Images are uploaded and
|
||||||
# registered via a home region, and then copied to other regions.
|
# registered via a home region, and then copied to other regions.
|
||||||
|
|
||||||
# The home region requires an s3 bucket, and a "vmimport" IAM role
|
# The home region requires an s3 bucket, and an IAM role named, by default,
|
||||||
# with access to the S3 bucket. Configuration of the vmimport role is
|
# "vmimport" IAM role with access to the S3 bucket. The name can be
|
||||||
# documented in
|
# configured with the "service_role_name" variable. Configuration of the
|
||||||
|
# vmimport role is documented in
|
||||||
# https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html
|
# https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html
|
||||||
|
|
||||||
# set -x
|
# set -x
|
||||||
@ -18,6 +19,7 @@ set -euo pipefail
|
|||||||
state_dir=$HOME/amis/ec2-images
|
state_dir=$HOME/amis/ec2-images
|
||||||
home_region=eu-west-1
|
home_region=eu-west-1
|
||||||
bucket=nixos-amis
|
bucket=nixos-amis
|
||||||
|
service_role_name=vmimport
|
||||||
|
|
||||||
regions=(eu-west-1 eu-west-2 eu-west-3 eu-central-1 eu-north-1
|
regions=(eu-west-1 eu-west-2 eu-west-3 eu-central-1 eu-north-1
|
||||||
us-east-1 us-east-2 us-west-1 us-west-2
|
us-east-1 us-east-2 us-west-1 us-west-2
|
||||||
@ -196,7 +198,7 @@ upload_image() {
|
|||||||
|
|
||||||
log "Importing image from S3 path s3://$bucket/$aws_path"
|
log "Importing image from S3 path s3://$bucket/$aws_path"
|
||||||
|
|
||||||
task_id=$(aws ec2 import-snapshot --disk-container "{
|
task_id=$(aws ec2 import-snapshot --role-name "$service_role_name" --disk-container "{
|
||||||
\"Description\": \"nixos-image-${image_label}-${image_system}\",
|
\"Description\": \"nixos-image-${image_label}-${image_system}\",
|
||||||
\"Format\": \"vhd\",
|
\"Format\": \"vhd\",
|
||||||
\"UserBucket\": {
|
\"UserBucket\": {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user