Skip to main content

lib/formation/aws/iam/manager.ex

defmodule Formation.Aws.IAM.Manager do
  alias Formation.Aws.Bucket
  alias Formation.Aws.IAM
  alias Formation.S3.Credential

  def create(client, resource, params)

  def create(client, %Bucket{} = bucket, %{
        id: id,
        permission: "basic" = permission
      }) do
    policy_document = IAM.Policy.build(id, bucket, permission)

    user_name = "opsmaru-user-#{id}"

    create_user_params = %{
      "Path" => "/",
      "UserName" => user_name,
      "Tags" => %{
        "member" => [
          %{"Key" => "component", "Value" => id}
        ]
      }
    }

    with {:ok, _user_response, _} <- AWS.IAM.create_user(client, create_user_params),
         {:ok, %{"CreatePolicyResponse" => create_policy_response}, _} <-
           AWS.IAM.create_policy(client, %{
             "PolicyName" => "opsmaru-policy-#{id}",
             "PolicyDocument" => Jason.encode!(policy_document)
           }),
         {:ok, _attach_policy_response, _} <-
           AWS.IAM.attach_user_policy(client, %{
             "UserName" => user_name,
             "PolicyArn" => create_policy_response["CreatePolicyResult"]["Policy"]["Arn"]
           }),
         {:ok, access_key_response, _} <-
           AWS.IAM.create_access_key(client, %{"UserName" => user_name}) do
      Credential.create(%{
        type: :instance,
        endpoint: "s3.#{client.region}.amazonaws.com",
        bucket: bucket.name,
        region: client.region,
        acl: bucket.acl,
        access_key_id:
          access_key_response["CreateAccessKeyResponse"]["CreateAccessKeyResult"]["AccessKey"][
            "AccessKeyId"
          ],
        secret_access_key:
          access_key_response["CreateAccessKeyResponse"]["CreateAccessKeyResult"]["AccessKey"][
            "SecretAccessKey"
          ]
      })
    end
  end
end