moto/scripts/ssm_get_default_amis.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

73 lines
2.4 KiB
Python
Raw Permalink Normal View History

import time
import boto3
import json
import time
import os
import subprocess
from datetime import timezone
from moto.core.utils import unix_time
from moto.ec2.utils import gen_moto_amis
def retrieve_by_path(client, path):
x = client.get_parameters_by_path(Path=path, Recursive=True)
parameters = x["Parameters"]
next_token = x["NextToken"]
while next_token:
x = client.get_parameters_by_path(Path=path, Recursive=True, NextToken=next_token)
parameters.extend(x["Parameters"])
next_token = x.get("NextToken")
return parameters
def main():
"""
Retrieve the latest AMI-details from SSM
- Download from AWS
- Store this in the dedicated moto/ssm/resources-folder
"""
regions = boto3.Session().get_available_regions("ssm")
for region in regions:
client = boto3.client('ssm', region_name=region)
ec2 = boto3.client("ec2", region_name=region)
default_param_path = "/aws/service/ami-amazon-linux-latest"
# Retrieve default AMI values
try:
params = retrieve_by_path(client, default_param_path)
for param in params:
param["LastModifiedDate"] = unix_time(param["LastModifiedDate"].astimezone(timezone.utc).replace(tzinfo=None))
root_dir = (
subprocess.check_output(["git", "rev-parse", "--show-toplevel"])
.decode()
.strip()
)
dest = os.path.join(root_dir, f"moto/ssm/resources/ami-amazon-linux-latest/{region}.json")
print("Writing data to {0}".format(dest))
with open(dest, "w") as open_file:
json.dump(params, open_file, sort_keys=True, indent=2)
# Retrieve details about AMIs from EC2
image_ids = [p["Value"] for p in params]
images = ec2.describe_images(ImageIds=image_ids)["Images"]
image_as_dicts = gen_moto_amis(images)
dest = os.path.join(root_dir, f"moto/ec2/resources/latest_amis/{region}.json")
print("Writing data to {0}".format(dest))
with open(dest, "w") as open_file:
json.dump(image_as_dicts, open_file, sort_keys=True, indent=2)
time.sleep(0.5)
except Exception as e:
print(e)
# We might encounter an error if we do not have access to a region - just ignore and try the next region
if __name__ == "__main__":
main()